#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. Понял! Можете ли вы отредактировать свой ответ и добавить свое дополнительное объяснение (просто опубликуйте точный комментарий выше в дополнение к вашему первоначальному ответу), я думаю, это очень помогает, и я отмечу ваш как ответ. Спасибо!