Предположим, у вас есть иерархия UIView, подобная этой
UIViewController
->UITableView
-->UITableViewCell
--->UITextView
Теперь, когда происходит событие, скажите
func textViewDidEndEditing(_ textView: UITextView) {}
У вас есть ссылка на textView, но, допустим, вам нужен пользовательский интерфейс изменить для всей иерархии, а также моделей данных, как вы это делаете?
Один из подходов состоит в том, чтобы дать ему все ссылки, но это очень утомительно
class CustomTextView {
init(model: Data, cell: UITableViewCell, tableview: UITableView) {//...}
func textViewDidEndEditing(_ textView: UITextView) {
//update model, update cell, update tableview
}
}
Также мне нужно было бы передать аналогичные ссылки на ячейку и табличное представление.
Другой подход - установить делегата на уровне контроллера. И тогда у вас есть:
class MyController: UITableViewController {
func textViewDidEndEditing(_ textView: UITextView) {
//tableView.updateUI()
//cell = tableView.cellForRowAtIndexPath...
//cell.updateUI()
//cell.textView.updateUI()
//model.updateData()
}
}
Но тогда это приводит к массивному контроллеру представления.
Каков правильный шаблон проектирования, когда каждому представлению нужен доступ ко всем другим представлениям?