在“外出”按钮上获取TableViewCell IndexPath时出现错误

时间:2019-07-15 10:09:01

标签: ios swift tableview

我正在获取索引并执行多个选择复选框,但是当我未进行调试时。它因错误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外部的按钮单击上的所有复选框

1 个答案:

答案 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()
    }