viewDidLoad дочернего контроллера просмотра вызывается перед родительским контроллером просмотра?

#ios #uiviewcontroller

#iOS #uiviewcontroller

Вопрос:

В раскадровках я настраиваю parentViewController для встраивания childViewController. Я запускал операторы печати в обоих их viewDidLoad() методах, и представление моего дочернего контроллера представления загружается перед родительским. Я не получаю доступ к дочернему представлению prepare(for:) .

Кто-нибудь знает, почему дочернее представление загружается раньше родительского? Я бы подумал, что, поскольку раскадровки / переходы автоматически вызывают parentView.addSubview(childView) это, это будет означать, что родительское представление загружается первым, поэтому мы можем вызвать addSubview .

Комментарии:

1. Как вы настроили дочерний контроллер просмотра? Вы предоставили здесь очень мало информации. Было бы полезно показать один код или раскадровку и т. Д…

2. Я имел в виду, что segue / storyboards в какой-то момент добавляет дочернее представление к родительскому. Это важно, потому что я пытаюсь лучше понять жизненный цикл контроллера представления по отношению к их дочерним элементам и что может привести к загрузке родительского представления последним. У меня также есть код, который программно настраивает и добавляет дочерний контроллер просмотра в parentViewController в its viewDidLoad , и мне нужно знать, как / почему родительские вызовы viewDidLoad после того, как все дочерние VC с раскадровкой сначала вызвали их.

3. Но содержание вопроса «почему» остается неясным. Это просто порядок событий. Мне это кажется совершенно логичным и правильным. Вы не можете добавить представление, которое не загружено, поэтому, очевидно , дочерний элемент должен загрузить свое представление, чтобы это представление было добавлено к родительскому представлению. Кого волнует, в каком порядке они загружаются?

4. @Fogmeister childViewController — это пустой ViewController с инструкцией print в нем viewDidLoad , он находится в раскадровках и имеет переход от parentViewController к childViewController. Это очень просто, не думал, что код имеет большое значение, поскольку он будет шаблонным (за вычетом печати viewDidLoad )

Ответ №1:

Что вы забываете loadView() , так это метод жизненного цикла, который предшествует viewDidLoad() . loadView() отвечает за построение представления и вложенного представления, и если вы напечатаете в этом методе, вы обнаружите, что родительский loadView() вызывается перед дочерним, и это потому, что родительский вид должен быть создан до того, как он сможет добавлять вложенные представления, например, дочерний вид (вы правы). loadView() также устанавливается связь родитель-потомок (в родительском loadView() ), и родитель должен получить доступ к своим дочерним viewDidLoad() элементам, прежде чем получить доступ к себе viewDidLoad() , потому что дочерний вид (по сути) является родительским представлением. Родительский элемент не имеет представления, в некотором смысле он отображает только его дочерние представления. Поэтому родительский элемент должен получить доступ к своим дочерним viewDidLoad() элементам, прежде чем он сможет заявить, что его собственное представление загружено.

Комментарии:

1. Спасибо @bsod, просто чтобы уточнить, вы говорите, что родительский loadView() вызывается первым, затем дочерний loadView() вызывается вторым? Если это так, не означает ли это, что родительский элемент должен запускаться viewDidLoad() первым? Я в замешательстве, как это будет сначала дочерним, если сначала loadView() вызывается родительский.

2. Родитель должен загрузить свое представление, прежде чем он сможет добавить какое-либо вложенное представление, и поэтому родительское loadView представление всегда будет предшествовать дочернему loadView . Тем не менее, отношения родитель-потомок также устанавливаются в loadView (в родительском), и родитель больше заинтересован в том, чтобы получить дочерний viewDidLoad элемент, прежде чем получить его, viewDidLoad потому что представление дочернего элемента — это то, что увидит пользователь.

3. Понял! Можете ли вы отредактировать свой ответ и добавить свое дополнительное объяснение (просто опубликуйте точный комментарий выше в дополнение к вашему первоначальному ответу), я думаю, это очень помогает, и я отмечу ваш как ответ. Спасибо!