Каков хороший способ сделать ссылки между каждым UIView в иерархии? - PullRequest
0 голосов
/ 03 марта 2020

Предположим, у вас есть иерархия 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()
  }
}

Но тогда это приводит к массивному контроллеру представления.

Каков правильный шаблон проектирования, когда каждому представлению нужен доступ ко всем другим представлениям?

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Ваша вторая идея ближе к общей практике, которая заключается в использовании шаблона делегирования, делающего V C делегатом. Работа V C заключается в изменении модели на основе внешних событий и обновлении представлений на основе изменений модели.

Просмотр ваших комментариев о методе делегата. Мутировать модель в первую очередь. Затем способ обновления табличного представления состоит в перезагрузке ячеек (либо выборочно, либо reloadData, чтобы перезагрузить все видимое). Если V C контролирует другие представления, которые должны измениться в результате изменения модели, он должен это сделать также. (и это просто прекрасно сделать в одном или нескольких методах updateUI)

«Но это приводит к массивному контроллеру представления». Да вроде. Одна из идей состоит в том, чтобы уменьшить их за счет декомпозиции VC и / или расширений классов. Также помните, что модель не просто инертные данные. Распространенным источником раздувания V C является бизнес-логика c в V C, которая будет лучше реализована самой моделью (в виде набора объектов, а не просто данных).

0 голосов
/ 03 марта 2020

NotificationCenter и Observer pattern - это будет лучшим вариантом в вашем случае.

С NotificationCenter вы можете передавать данные из одной части вашего приложения в другую. Он использует шаблон Observer для информирования зарегистрированных наблюдателей при поступлении уведомления, используя центральный диспетчер под названием Notification Center

{ ссылка }

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