viewDidLoad, называемый дважды на rootViewController в запуске

Я использовал бы небезопасный код и работал бы for цикл, сравнивающий указатели Int32.

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

20
задан etolstoy 16 June 2014 в 17:26
поделиться

4 ответа

Странно. Я не видел этого конкретного случая, но в целом вы должны предположить, что viewDidLoad можно вызывать несколько раз. Он будет вызываться всякий раз, когда загружается файл пера, который ссылается на этот контроллер.

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

4
ответ дан 29 November 2019 в 23:48
поделиться

Нельзя предполагать, что viewDidLoad будет вызываться только один раз. Если вы инициализируете объекты и хотите получить гарантию, выполните инициализацию либо в методе инициализации, либо при загрузке из файла пера из метода awakeFromNib.

3
ответ дан 29 November 2019 в 23:48
поделиться

Лично я бы пошел с:

do
{
    cout << "Were you admitted? [y/n]" << endl;
    cin >> type;
}
while( !cin.fail() && type!='y' && type!='n' );
-121--3034782-

Firefinder отлично подходит для тестирования селекторов. Однако если вы также хотите получить селектор CSS для элемента, попробуйте Gadget .

-121--1086946-

Я выполнил отладку, и вот что я обнаружил о порядке загрузки ViewController :

initWithNibName:bundle:     self = <original instance>, retainedOutlet = 0x0  
loadView >>>                self = <original instance>, retainedOutlet = 0x0  
      initWithCoder:        self = <coder instance>,    retainedOutlet = 0x0  
      initWithCoder:        self = <coder instance>,    retainedOutlet = 0x0  
      setView:              self = <original instance>, retainedOutlet = 0x0  
      setRetainedOutlet:    self = <original instance>, retainedOutlet = 0x1613c40  
      viewDidLoad           self = <coder instance>,    retainedOutlet = 0x0  
      awakeFromNib          self = <coder instance>,    retainedOutlet = 0x0  
loadView <<<  
viewDidLoad                 self = <original instance>, retainedOutlet = 0x1613c40  
viewWillAppear:             self = <original instance>, retainedOutlet = 0x1613c40  
dealloc                     self = <coder instance>,    retainedOutlet = 0x0
viewDidAppear:              self = <original instance>, retainedOutlet = 0x1613c40

Во время метода loadView вызывается initWeyCoder: и создается новая копия viewController . это то, что передается в несколько методов (например, viewDidLoad ). копия будет уничтожена позже при вызове dealloc. Хорошая новость в том, что в этой копии сохраненные розетки не настроены, поэтому вы можете использовать это как тест, чтобы знать, следует ли инициализировать переменные, вызывать другие методы и, что самое главное, следует ли выпускать и уничтожать объекты во время dealloc.

Выбор ключа: для реального viewController будут сконфигурированы сохраненные свойства IBOutlet . если вы находитесь в переопределенном методе, который вызывается несколько раз, просто проверьте одно из сохраненных свойств IBOutlet для NULL . если они имеют значение NULL , то немедленно возвращайте.

Кто-либо получил какие-либо подсказки относительно того, почему это происходит в этом пути?

Побочный эффект от этого: вы не можете использовать awakeStartNib надежно.

8
ответ дан 29 November 2019 в 23:48
поделиться

У меня была аналогичная проблема, и она была результатом переименования моего файла XIB и его класса ViewController (владелец файла). Не делайте этого - так как на самом деле представления и делегаты неправильно определены внутри XML, и это не подлежит восстановлению. Между тем, у меня была ссылка на загрузку оригинального VC, который должен был стать моим новым VC. Я считаю, что это заставило родителя воссоздать себя, а затем VC, который я действительно пытался вызвать.По сути, я создал непрямую рекурсию для VC, которая имеет записи x2 viewDidLoad в моей трассировке.

Я не думаю, что есть веская причина для x2 viewDidLoad , так как это генезис и может вызывать другую инициализацию с неверными предполагаемыми предварительными условиями. Каждый раз, когда я видел x2 viewDidLoad, это была ошибка с моей стороны - довольно часто, когда я проводил рефакторинг и перемещал классы VC.

Если есть веская причина для более чем на viewDidLoad звонка, пожалуйста, кто-нибудь (Apple Dev, вы слушаете) объясните это в технических деталях - я искал этот ответ уже несколько месяцев.

3
ответ дан 29 November 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: