ВЫКЛЮЧИТЕ все UIS-переключатели, кроме текущего в tableViewCell

Мне нужно, чтобы пользователь мог выбрать только одно значение из ячеек.

@objc func switchChangedPeriod(_ sender : UISwitch!){
    if sender.isOn{
        periodUserString = period[sender.tag].periodUser
        periodSystemString = period[sender.tag].periodSystem
        //sender.setOn(false, animated: true) how to set OFF all switches except current
    }else{
        periodUserString = ""
        periodSystemString = ""
    }
}

Или, может быть, мне нужно отключить только предыдущий UISwitch?

1 ответ

Сначала создать delegate для тебя UITableViewCell подкласс и объявить функцию для переключателя, когда он меняет свое значение.

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)
    ...
}
Другие вопросы по тегам