我正在获取索引并执行多个选择复选框,但是当我未进行调试时。它因错误Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
而崩溃,如果我使用的是iPhone XR设备,则它会使特定的7索引崩溃。只是因为UITableView没有滚动。因此,如何在不滚动的情况下做到这一点。
此行let cell = connectionTableView.cellForRow(at: IndexPath(row: index, section: 0)) as! NotificationTableViewCell
崩溃
@IBAction func btnSelectAll(_ sender: Any) {
let totalRows = connectionTableView.numberOfRows(inSection: 0)
print(totalRows)
for index in 0..<totalRows {
print(index)
connectionTableView.selectRow(at: IndexPath(row: index, section: 0), animated: false, scrollPosition: .none)
let cell = connectionTableView.cellForRow(at: IndexPath(row: index, section: 0)) as! NotificationTableViewCell
cell.btnCheck.isSelected = !cell.btnCheck.isSelected
if cell.btnCheck.isSelected == false
{
arrayMultiple.remove(at: index)
print(arrayMultiple)
checkButton = false
}
else
{
let notificationDict = notificationArray[index ] as! Dictionary<String,Any>
let notification_id = notificationDict["_id"] as? String
arrayMultiple.append(notification_id!)
print(arrayMultiple)
checkButton = true
}
}
}
我只想选择位于TableView外部的按钮单击上的所有复选框
答案 0 :(得分:0)
代码崩溃,因为您将访问当前不可见的单元格。 cellForRow(at
为不可见的单元格返回nil
。
尽管如此,您的方法又麻烦又容易出错。
使用结构而不是字典作为数据源并添加成员isSelected
struct NotificationItem {
let id : Int
// other members
var isSelected = false
}
var notificationArray = [NotificationItem]()
删除arrayMultiple
。
在cellForRow
中,根据结构中的值设置复选框
func tableView(_ tableView, cellForRowAt....
let item = notificationArray[indexPath.row]
cell.btnCheck.isSelected = item.isSelected
...
现在您可以将IBAction
中的代码简化为
@IBAction func btnSelectAll(_ sender: Any) {
notificationArray.forEach{ $0.isSelected = true }
connectionTableView.reloadData()
}