iOS: Почему мы должны добавить дочерний контроллер представления, когда добавление представления как подпредставление работает? - PullRequest
0 голосов
/ 25 февраля 2020

Существует ViewController1, у которого есть stackView. Я создал экземпляр ViewController2 и добавил его представление в качестве подпредставления в stackView ViewController1. Я хотел видеть, если только при этом вызывается viewDidLoad ViewController2, и при этом ViewController2 viewDidLoad вызывался, когда я добавлял представление ViewController2 в stackView ViewController1. Например: в ViewController1 self.stackView.addArrangedSubView(viewControler2.view) Тогда зачем нам нужно добавить addChild (viewController2), а затем добавить представление как подпредставление, те типичные строки, которые добавляют childController и его представление в иерархии контроллера родительского представления

1 Ответ

7 голосов
/ 25 февраля 2020

Конечно, viewDidLoad был вызван. Это произошло мгновенно, как только вы обратились к view ViewController2 в своем коде.

Но, допустим, ваш ViewController2 выполняет и другие функции, помимо загрузки представления. Предположим, что его представление содержит кнопку, которая через действие привязана к функции в ViewController2. Если вы сейчас нажмете эту кнопку, ничего не произойдет.

Это потому, что сам ViewController2 мертв: он исчез в клубе дыма.

Это можно увидеть, реализовав deinit в ViewController2. Вы увидите, что, как называется viewDidLoad, так и deinit. Вы остаетесь с представлением контроллера представления, у которого нет контроллера представления. Это плохо.

Существует контроллер представления иерархия , который отвечает за поддержание отношений между контроллерами представления. Когда вы добавляете ViewController2 как дочерний контроллер представления ViewController1, вы поддерживаете эту иерархию и поддерживаете ее правильно в соответствии с правилами, которые говорят:

Если представление VC2 находится где-то внутри представления VC1, то VC2 должен быть дочерним (на некоторой глубине) VC1.

Другими словами, иерархия представления и иерархия контроллера представления должны работать вместе. В противном случае цепочка респондента будет разорвана, и жизнь станет хаосом.


(Существуют и другие требования, когда вы делаете один контроллер представления дочерним для другого, например отправка didMoveToParent дочернему элементу как часть открывающий танец, а также другие обязанности по пересылке сообщений, чтобы гарантировать, что дочерний контроллер представления получит другие сообщения, такие как viewDidAppear, в нужное время. Это сложный бизнес. Однако я сосредоточил свой ответ на самом основном c часть того, что вы спросили.)


Я должен добавить: если ваша цель состояла в том, чтобы просто извлечь представление из кончика и вставить его в ваше собственное представление, вы Конечно, можно сделать это, нет проблем. То, что вы не должны делать, это использовать контроллер вида как своего рода ма gnet или пылесос, чтобы получить представление для вас, если вы намерены разрешить go самого контроллера представления.

...