首页 > 解决方案 > 快速按下按钮时检查是否选择了单元格

问题描述

用户界面照片

在这张照片中,您可以看到用户可以打开或关闭每个单元格的开关。最后,当用户按下按钮时,我需要将选定的单元格(打开开关的单元格)添加到数组中以将其发送到 API。

当用户单击按钮(在屏幕底部)时,我应该得到unitNoandpersonId并将它们存储在我的结构中

我的模型:

struct Itemm : Codable {
    var unitNo:Int?
    var personId:Int?
}
struct welcome {
    var items : [Itemm?]
}

我必须发送一个如下所示的数组:

{
  "items": [
    {
      "unitNo": 0,
      "personId": 0
    }
  ]
}

我对如何使用 if 语句访问 UIButton 中的单元格数据然后存储它们感到有些困惑。如果有任何帮助,我将不胜感激。

表视图:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "SmsCell") as? SmsTableViewCell

    cell?.PhonNumberLbl.text = data![indexPath.section].contacts[indexPath.row]?.phoneNumber
    cell?.NameLbl.text = data![indexPath.section].contacts[indexPath.row]?.name
    cell?.selectedTF.isOn = (data![indexPath.section].contacts[indexPath.row]?.selected)!

    return cell!
}

API 响应:

 [
    {
        "contacts": [
            {
                "id": 9827,
                "selected": true,
                "phoneNumber": "09203137745",
                "name": "owner"
            },
            {
                "id": 10159,
                "selected": true,
                "phoneNumber": "08523698522",
                "name": "hff"
            },
            {
                "id": 10161,
                "selected": true,
                "phoneNumber": "09586731218",
                "name": "hjdldue"
            }
        ],
        "unitNo": 1,
        "unitPlaque": "jack",
        "billText": "texttext"
    },
    {
        "contacts": [
            {
                "id": 10145,
                "selected": true,
                "phoneNumber": "09123809556",
                "name": "mmm"
            },
            {
                "id": 10160,
                "selected": true,
                "phoneNumber": "85233366888",
                "name": "ttt"
            }
        ],
        "unitNo": 2,
        "unitPlaque": "mm",
        "billText": "texttext"
    }
]

我想我没有清楚地解释我在寻找什么。

我调用的第一个方法是一种GET方法,它为我提供了我在表中呈现的数据。用户只能更改开关,用户可以根据需要更改多次,直到他/她按下按钮(在屏幕底部)。

当按下按钮时,我需要获取每个单元格后面的隐藏数据并将它们存储在我的结构中并将其发送到具有另一种方法的 API。当用户按下按钮时,我需要从打开了开关的单元格中提取 2 个属性。

Presenter 表示:

func sendSmsForAllTheMembers(AptId:String , data:[String:Int])
{
    ApiGenerator.request(targetApi: ApartemanService.sendSms(aptId: AptId, data: data), responseModel: Nil.self, success: { (response) in
        if response.response.statusCode == 200 {
            self.view?.SendingSmsSuccess()
        }else {
            do{

                var errorMessage = try response.response.mapString()
                errorMessage = errorMessage.replacingOccurrences(of: "\"", with: "",
                                                                 options: NSString.CompareOptions.literal, range:nil)

                self.view?.SendingSmsFailed(errorMessage: errorMessage)

            }catch let error{
                print(error)
                self.view?.SendingSmsFailed(errorMessage: "error")
            }

        }

    }) { (error) in
        self.view?.SendingSmsFailed(errorMessage: "error")
    }
}

标签: iosswiftuitableview

解决方案


您的第一个问题是您需要以某种方式将开关状态存储在视图控制器中;您不能将其直接存储在单元格中,因为单元格在您的表格视图滚动时被重新使用。

虽然您可以将开关状态存储在模型结构中,但我可能不会这样做,因为它会使您的结构可变。我会使用 aSet<IndexPath>来跟踪选择。

您的下一个问题是知道何时更改单元格中的开关。你可以为你的UITableviewCell子类提供一个闭包来处理这个问题。

短信单元

var switchHandler: ((Bool)->Void)?

@IBAction func switchChanged(_ sender: UISwitch) {
    self.switchHandler?(sender.isOn)
}

视图控制器

var selectedCells = Set<IndexPath>()

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "SmsCell") as! SmsTableViewCell

    let cellData = self.data![indexPath.section]
    let contact = cellData.contacts[indexPath.row]

    cell.PhonNumberLbl.text = contact.phoneNumber
    cell.NameLbl.text = contact.name
    cell.selectedTF.isOn = self.selectedCells.contains(indexPath)
    cell.switchHandler = { (switchState) in
        if switchState {
            self.selectedCells.insert(indexPath)
        } else {
            self.selectedCells.remove(indexPath)
        }
    }

    return cell
}

您的最终任务是创建可以编码为所需 JSON 的结构:

struct Itemm: Codable {
    let unitNo: Int
    let personId: Int
}

struct Welcome: Codable {
    var items:[Itemm]
}

视图控制器

@IBAction func sendButtonTapped(_ sender: UIButton) {

   var items = [Itemm]() 
   for indexPath in self.selectedCells {
       let data = self.data![indexPath.section]
       let contact = data.contacts[indexPath.row]
       let newItem = Itemm(unitNo: data.unitNo, personId: contact.id)
       items.append(newItem)
   }
   let welcome = Welcome(items: items)
   // Now you can encode and send welcome
}

推荐阅读