当我在 swift 中单击表视图外的按钮时,如何 select 所有行并在表视图中获取其 ID

How to select all rows and get its id in tableview when i click button outside of tableview in swift

我有带自定义复选框的表格视图。在这里,如果我单击位于 tableview 之外的 select all 按钮,那么我需要显示所有 tableview 行 selected with checkmark

code: tableview 单元格包含行 selection 的 chkImg 和 chkBtn。使用此代码我可以 select 和 deselect 多行但是 如果我单击 selectAllBtn 我需要所有行 select 与 cell.chkImg.image = UIImage(systemName: "checkmark")arrSelectedRows

中的所有行 ID

如何操作请指导我

 var arrSelectedRows:[Int] = []

@IBAction func selectAllBtn(_ sender: UIButton) {
        tableView.reloadData()
}

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: ServiceListTableViewCell.cellIdentifier, for: indexPath) as! ServiceListTableViewCell

let id = self.serviceList?.result?.services?[indexPath.row].id ?? 0

 if arrSelectedRows.contains(id){
     cell.chkImg.image = UIImage(systemName: "checkmark")
 }else{
     cell.chkImg.image = UIImage(named: "checkbox_inactive")
}
 cell.chkBtn.tag = id
 cell.chkBtn.addTarget(self, action: #selector(checkBoxSelection(_:)), for: .touchUpInside)

return cell
}

@objc func checkBoxSelection(_ sender:UIButton)
{
print(sender.tag)

if self.arrSelectedRows.contains(sender.tag){
    self.arrSelectedRows.remove(at: self.arrSelectedRows.index(of: sender.tag)!)
    print("arrayof selected row ids \(arrSelectedRows)")
}else{
    self.arrSelectedRows.append(sender.tag)
}
self.tableView.reloadData()
}

点击按钮,执行这行代码。

for i in 0..<self.serviceList?.result?.services.count{
   arrSelectedRows.append(self.serviceList?.result?.services?[i].id)
}
self.tableView.reloadData()

你可以使用Swift map函数,通过它你可以得到你selectedArray

中的所有id
@IBAction func selectAllBtn(_ sender: UIButton) {
   let servicesCount = self.serviceList?.result?.services?.count ?? 0
   if servicesCount == self.arrSelectedRows {
       self.arrSelectedRows.removeAll()
   } else {
       self.arrSelectedRows = self.serviceList?.result?.services?.map({[=10=].id ?? 0})
   }
   tableView.reloadData()
}

@Azruddin Shaikh 对这个问题的回答是正确的。我将添加通过按同一个按钮取消选择所有项目的逻辑。

首先,您必须创建一个 IBOutlet 按钮

@IBOutlet weak var selectAllButton: UIButton!

然后在IBAction方法中,根据按钮的当前标题更改按钮的标题。

@IBAction func selectAllBtn(_ sender: UIButton) {
    let titleText = sender.titleLabel?.text ?? ""
    if titleText == "Select All" {
        self.arrSelectedRows = self.serviceList?.result?.services?.map({[=11=].id ?? 0})
        self.selectAllButton.setTitle("Deselect All", for: .normal)
    } else if titleText == "Deselect All" {
        self.arrSelectedRows.removeAll()
        self.selectAllButton.setTitle("Select All", for: .normal)
    }
    tableView.reloadData()
}