我已将Switch设置为tableView单元格的一部分并设置CustomCell类来处理该操作,该类看起来像这样
class SwitchTableViewCell: UITableViewCell {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var `switch`: UISwitch!
var switchAction: ((Bool) -> Void)?
@IBAction func switchSwitched(_ sender: UISwitch) {
switchAction?(sender.isOn)
}
}
我现在需要做的是确保当一个开关打开时,其他行中的所有其他开关都将关闭。表格行像这样加载
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let thisRow = rowData[indexPath.row]
switch thisRow.type {
case .text:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "textfieldCell", for: indexPath) as? MovingTextFieldTableViewCell else {
Logger.shared.log(.app, .error, "Could not load TextFieldTableViewCell")
fatalError()
}
cell.textField.textFieldText = thisRow.data as? String
cell.textField.labelText = thisRow.title
cell.dataChanged = { text in
thisRow.saveData(text)
}
cell.errorLabel.text = nil
return cell
case .switch:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "switchCell", for: indexPath) as? SwitchTableViewCell else {
Logger.shared.log(.app, .error, "Could not load SwitchTableViewCell")
fatalError()
}
cell.label.text = thisRow.title
cell.switch.isOn = thisRow.data as? Bool ?? false
cell.switchAction = { isOn in
thisRow.saveData(isOn)
}
return cell
}
}
每行中有一个thisRow类型(文本/开关),saveData方法看起来像这样
func saveData(_ data: Any?) {
self.data = data
}
更改Switch时,表不会更新,但由于该类一次只处理一行动作,因此我不确定如何从自定义Switch类更新TableView
答案 0 :(得分:0)
这将是设置每个单元格的switchAction
的控制器的责任。
当调用switchAction
闭包时,闭包的提供者必须根据需要更新其数据模型并重新加载表视图。
您需要将switchAction
中的cellForRowAt
更新为以下内容:
cell.switchAction = { isOn in
thisRow.saveData(isOn)
// This switch is on, reset all of the other row data
if isOn {
for (index, row) in rowData.enumerated() {
if index != indexPath.row && row.type == .switch {
row.saveData(false)
}
}
tableView.reloadData()
}
}