Как обновить информацию UITableViewController, когда IBAction ячейки запущен? - PullRequest
0 голосов
/ 31 марта 2019

У меня есть UITableViewController с пользовательским UITableViewCell, и в каждой ячейке есть UISwitch внутри.

Необходимо обновить информацию о моей таблице (строка в заголовке), когда любой из этих переключателей включается / выключается (необходимо отображать количество переключателей в заголовке раздела).

Я не уверен в iOS и UIKit, но я уже нашел 2 возможных решения:

  1. реализовать шаблон делегата между контроллером ячейки и таблицы
  2. написать логику обновления внутри функции tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

В первом решении мой TableViewController соответствует

protocol TableViewDelegate {
  func reloadTable()
}

, которые обновляют свой внутренний счетчик включений - и обновляют раздел заголовка в функции tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? - вызывая

DispatchQueue.main.async{
  self.tableView.reloadData()
}

Очевидно, что мой обычай UITableViewCell имеет ссылку на делегата TableViewController и вызывает его reloadTable().

Второе решение - это возможность получить информацию о каждой ячейке в методе cellForRowAt indexPath. Я обнаружил, что эта функция вызывается не только при рисовании таблицы, но и при взаимодействии с компонентом в ячейке.

Так мне нужно реализовать подсчет в функции cellForRowAt indexPath? Или первое решение с шаблоном делегата является хорошим?

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

вы должны использовать делегата в своей ячейке .. можете пойти так:

protocol CellDelegate: class {
   func actionDidPressed()
}

, тогда в вашей ячейке следует использовать его

class cell: UITableViewCell {
    weak var delegate: CellDelegate?

    @IBAction func buttonPressed() {
       delegate?.actionDidPressed()
    }

 }

, и, наконец, в вашем контроллере вы можете соответствоватьк нему

class ViewController: UIViewController {

     // in your cellAtIndexPath method after creating cell you can 

     cell.delegate = self 

}

Я предпочитаю сделать расширение View Controller для соответствия делегатам

extension ViewController: CellDelegate {
  func actionDidPressed() {
      // add the action you need here 
   }
}
0 голосов
/ 31 марта 2019

Вы можете использовать NSNotification для передачи данных между различными представлениями.Вам необходимо зарегистрировать контроллер получателя с помощью метода addObserver и использовать post для отправки сообщения.Вы можете сослаться на этот пост

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...