首先为您的UITableViewCell 子类创建delegate,并在其值更改时声明switch 函数。
protocol CellDelegate {
func switchChangedValue(_ value: Bool, period: Period)
}
现在在您的子类中创建 delegate 和 period 变量,并在您的开关更改其值时创建 IBAction
class YourCell: UITableViewCell {
var delegate: CellDelegate?
var period: Period?
...
@IBAction func switchChanged(_ sender: UISwitch) {
delegate?.switchChangedValue(sender.isOn, period: period!)
}
}
接下来让我们在控制器中为选定的Period 创建全局变量
var selectedPeriod: Period?
现在将您的委托实现为ViewController,并将periodUserString 和periodSystemString 设置为正确的格式,如果值为true,则将selectedPeriod 设置为period,如果开关关闭,请将其设置为@987654336 @。最后重新加载 TableView 的数据
class ViewController: UIViewController, CellDelegate {
...
func switchChangedValue(_ value: Bool, period: Period) {
periodUserString = value ? period.periodUser : ""
periodSystemString = value ? period.periodSystem : ""
selectedPeriod = value ? period : nil
tableView.reloadData()
}
}
...这里你应该考虑当你有selectedPeriod变量时是否需要设置periodUserString和periodSystemString
现在在cellForRowAt 中设置UISwitch 状态取决于,如果selectedPeriod 等于索引等于indexPath.row 的数组中的某个period(请注意,现在您的Period 类/结构必须是可编码)。并且不要忘记设置单元格的delegate 和period。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
... // cell as! YourCell
cell.delegate = self
let period = period[indexPath.row]
cell.period = period
cell.switch.setOn(period == selectedPeriod, animated: false)
...
}