在我的iOS Switch应用程序中,每个表格单元格中都有一个BEMCheckBox。当出列单元格时,我想设置一个被调用的委托。
我的问题是复选框工作正常但是从不调用委托。如何为每个复选框添加委托?
我想知道哪个indexPath是复选框。计划是将模型对象传递给委托并相应地更新它。
表格单元格
let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath)
cell.doneCheckbox.delegate = DoneBEMCheckBoxDelegate()
return cell
委托非常简单
class DoneBEMCheckBoxDelegate: NSObject, BEMCheckBoxDelegate {
@objc func didTap(_ checkBox: BEMCheckBox) {
print("Checkbox tapped")
}
}
答案 0 :(得分:1)
cell.doneCheckbox.delegate = DoneBEMCheckBoxDelegate()
正在本地变量中创建一个新的DoneBEMCheckBoxDelegate
对象,并将其指定为委托。由于委托属性较弱,因此在函数退出时会立即释放,因为没有强引用。
我建议将一个单独的对象类作为委托可能不是你想要的。
我将单元格设置为复选框委托,然后声明另一个协议,以便单元格可以拥有自己的委托,这将是您的表视图控制器。
protocol MyCellDelegate {
func checkBox(for cell: MyCell, isOn: Bool)
}
class MyCell: UITableViewCell, DoneBEMCheckBoxDelegate {
var delegate: MyCellDelegate?
override func awakeFromNib() {
super.awakeFromNib()
self.doneCheckBox.delegate = self
}
@objc func didTap(_ checkBox: BEMCheckBox) {
print("Checkbox tapped")
self.delegate?.checkBox(for: self, isOn: checkBox.isOn)
}
}
class YourViewController: MyCellDelegate {
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
...
cell.delegate = self
return cell
}
func checkBox(for cell: MyCell, isOn: Bool) {
guard let indexPath = tableView.indexPath(for: cell) else {
return
}
// Now do whatever you need to with indexPath
}
}
这样就可以避免创建其他对象和数据结构,如果单元格被重新排序,则不会出现问题,因为索引路径没有依赖关系。
答案 1 :(得分:0)
我注意到委托是checkbox类中的弱引用,因为它应该是:)所以我的委托在方法范围结束后被释放。
我通过在使用过程中将代理存储在视图控制器中来修复此问题。
var checkboxDelegates: [IndexPath:DoneBEMCheckBoxDelegate] = [:]
...
let checkboxDelegate = DoneBEMCheckBoxDelegate(realm: realm, set: set)
checkboxDelegates[indexPath] = checkboxDelegate
cell.doneCheckbox.delegate = checkboxDelegate