Как передавать данные между представлениями.Когда я должен использовать что? - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть иерархия вида, подобная этой:

  • UIViewController ( SingleEventViewController )
    • UIScrollView ( EventScrollView )
      • UIView ( contentView )
        • 3xUITableView (SurePeopleTV, MaybePeopleTV, NopePeopleTV (все унаследованные от того же UITableView)) и все другие элементы пользовательского интерфейса

SingleEventViewController хранит одно событие (переданное в инициализаторе).(Все события хранятся в Core-Data).

Три UITableViews предназначены для отображения пользователей, которые участвуют (или не участвуют) в мероприятии.Мой вопрос заключается в том, каковы возможности для заполнения табличных представлений данными и что бы вы порекомендовали в какой ситуации.


В настоящее время у меня есть свойство parentVC: SingleEventViewController во всех подпредставлениях, и я получаю такие данные:

override func loadUsers() {
//class SurePeopleTV
    guard let parentController = parentVC else { return }
    users = (parentController.thisEvent.eventSureParticipants?.allObjects as! [User])
    finishedLoading = true
    super.loadUsers()
}

.

func applyDefaultValues() {
//class EventScrollView
    guard let parent = parentVC else { return }
    titleLabel.text = parent.eventName
}

Я новичок в программировании, но у меня возникло ощущение, что я не должен создавать ссылку parentVC во всех моих классах.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Объект не должен (в идеале) знать о своих родителях - если он это делает, они «тесно связаны».Если вы измените родительский объект, ваш код может сломаться.В вашем случае ваш родительский объект должен иметь свойство thisEvent.

Вы хотите, чтобы ваши объекты были "слабо связаны", чтобы объект не знал о конкретном родительском объекте.

В Swift обычным способом передачи информации «обратно по цепочке» является использование шаблона проектирования делегата… https://developer.apple.com/documentation/swift/cocoa_design_patterns или использование замыканий.

См. Также https://www.andrewcbancroft.com/2015/04/08/how-delegation-works-a-swift-developer-guide/ для информации о делегировании

0 голосов
/ 26 сентября 2018

Прежде всего, если вы создадите ссылку на родительский ViewController, убедитесь, что он слаб, иначе вы можете столкнуться с проблемами управления памятью.

Редактировать: Как сказала Эшли Миллс,делегирует способ обработки этого

Рекомендованный способ передачи данных между ViewControllers использует что-то вроде этого Каждый раз, когда выполняется переход от контроллера представления, эта функция вызывается в этой функции.Этот код сначала проверяет, какой идентификатор имеет segue, и, если это тот, который вам нужен, вы можете получить доступ к ссылке на следующий контроллер представления и передать ему данные.
...