Сначала создайте delegate
для вашего UITableViewCell
подкласса и объявите функцию для 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
, если переключатель выключен, установите его на nil
.В конце перезагрузите данные вашего 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()
}
}
... здесь вы должны рассмотреть, нужно ли вам установить periodUserString
и periodSystemString
, когда у вас есть selectedPeriod
переменная
теперь устанавливает UISwitch
состояний в cellForRowAt
зависит от того, равен ли selectedPeriod
определенный period
в массиве с индексом, равным indexPath.row
(обратите внимание, что теперь ваш 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)
...
}