Принудительно запускать viewDidLoad на iOS

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

Я пытался использовать метод loadView, но Apple говорит, что вы не должны вызывать этот метод напрямую.

До сих пор я предпочитал использовать метод представления userInteractionEnabled, который на самом деле неявно вызывает метод viewDidLoad.

Есть ли элегантный способ заставить метод ViewControllers viewDidLoad срабатывать до того, как это должно произойти естественным образом (когда окно является ключевым и представлено)?


person Borut Tomazin    schedule 03.10.2012    source источник


Ответы (4)


Вы можете просто позвонить [viewController view];.

документация для UIViewController объясняет, почему свойство представления является ленивым -loaded и что viewDidLoad вызывается после загрузки представления.

person Carl Veazey    schedule 03.10.2012
comment
Так просто, но так мощно :) Спасибо! - person Borut Tomazin; 03.10.2012
comment
Ницца! Сначала я попробовал viewController.view, но он выдал предупреждение, но отправка ему представления сообщения таким образом вообще не дает предупреждения. - person Korey Hinton; 18.12.2014
comment
Это было именно то, что я искал, но есть ли документация/объяснение того, как это работает и что делает? - person Spartacus9; 06.04.2017
comment
@Spartacus9 Да, документация для UIViewController объясняет, как Свойство view загружается отложенно, а viewDidLoad вызывается после загрузки представления. - person Carl Veazey; 06.04.2017

В iOS 9 Apple наконец-то исправила это:

// Loads the view controller's view if it has not already been set.
@available(iOS 9.0, *)
public func loadViewIfNeeded()
person Rudolf Adamkovič    schedule 21.07.2016
comment
Вот реальный ответ - person klefevre; 05.09.2016

Swift 2.0 с тем же результатом решения @Carl Veazey:

let viewController = MyCustomViewController()
_ = viewController.view
person Thomás Pereira    schedule 20.01.2016
comment
Я пытаюсь это сделать с помощью Swift, и это не работает... Это перестало работать с более новыми версиями iOS/Swift? - person Luccas Correa; 28.04.2016
comment
Что вы имеете в виду под более новыми версиями iOS/Swift? Свифт 3.0? Я еще не тестировал Swift 3.0, поэтому не знаю, работает ли этот подход. - person Thomás Pereira; 28.04.2016
comment
Я использую swift 2.2, и это не работает для меня... Единственная разница между моим кодом и вашим заключается в том, что вместо того, чтобы самостоятельно создавать контроллер представления, я вызываю метод instanceiateViewControllerWithIdentifier экземпляра раскадровки. - person Luccas Correa; 28.04.2016
comment
Плохо, я создавал экземпляр NavigationController, поэтому он не работал... Спасибо. - person Luccas Correa; 28.04.2016
comment
Без проблем. Я только что проверил и подтверждаю, что он все еще работает! ;) - person Thomás Pereira; 28.04.2016

Вы можете создать глобальный экземпляр для этого контроллера (может быть в AppDelegate) и вызвать метод, для которого вы хотите выполнить действие. Затем при нажатии на этот контроллер не создавайте новый экземпляр. Просто используйте созданный вами экземпляр для глобального использования.

person Suresh Varma    schedule 03.10.2012