Это не так тривиально, как вы попробовали.Когда вы удаляете из очереди ячейку табличного представления, это означает, что она либо создаст новую ячейку, либо повторно использует старую.Например, у вас есть 100 ячеек, но вы можете видеть только 10 одновременно.Когда пользователь прокручивает страницу вниз, первая ячейка исчезает, а затем снова используется как 11-я ячейка.Итак, это физически одна и та же клетка.И, если вы добавите target-selector на его переключатель, это будет означать, что теперь у вас есть 2 действия с этим переключателем.Но, как вы, вероятно, выяснили, у вас все равно есть другие проблемы в этом случае (например, невозможность вставить путь индекса в метод).
Таблицу нужно использовать только как представление данных.Таким образом, вы должны изменить данные в другом месте.
Самое простое решение в вашем случае - добавить свой класс в саму ячейку.Просто назначьте его в ячейке для метода строки:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "ProgrammeToggleTableViewCell", for: indexPath) as? ProgrammeToogleTableViewCell else { return UITableViewCell() }
cell.programme = programmes[indexPath.row]
return cell
}
Теперь поместите всю логику внутри ячейки, например, например:
var programme: Programme? {
didSet {
refresh()
}
}
func refresh() {
guard let programme = programme else { return }
programmeToggle.isOn = programme.active
}
@IBAction private func switchToggled() {
self.programme?.active = programmeToggle.isOn
}
Теперь действие переключателя влияет на назначенную программу.В вашем случае этого должно быть достаточно.
В качестве альтернативы вам во многих случаях необходимо использовать делегатов.Контроллер вашего вида определит протокол о том, что переключатель был переключен, и вы назначите его своей ячейке:
cell.progremmeID = progremme.id
cell.delegate = self
return cell
, а затем протокол:
func programmeCell(_ sender: ProgrammeToogleTableViewCell, didToggleProgremme programmeID: String, toActive flag: Bool) {
programmes.first(where: { $0.id == programmeID })?.active = flag
}