как я могу сбросить все переключатели в табличном представлении от CustomCell - PullRequest
0 голосов
/ 10 мая 2018

Я установил 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 (Text / Switch), а метод saveData выглядит следующим образом

func saveData(_ data: Any?) {
    self.data = data
}

Таблица не являетсяобновляется при изменении Switch, но поскольку класс имеет дело только с одним действием строки за раз, я не уверен, как обновить TableView из пользовательского класса Switch

1 Ответ

0 голосов
/ 10 мая 2018

Это будет обязанность контроллера, который устанавливает 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()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...