Подтвердить что ты не робот

UIView addSubview действительно сохраняет представление?

Я столкнулся с ситуацией, которая, как представляется, предполагает иное. В следующем фрагменте кода, если я удаляю строку: self.navigationController = nav, представление корневого контроллера не будет отображаться, что указывает на то, что addSubview не может фактически сохранить представление, как было предложено иначе. Любая идея?

- (void)applicationDidFinishLaunching:(UIApplication *)application {   
   self.testViewController = [[TestViewController alloc] initWithNibName:@"TestView" bundle:  [NSBundle mainBundle]];

   UINavigationController *nav = [[UINavigationController alloc]  initWithRootViewController:self.testViewController];

   self.navigationController = nav;  //<-- if this line is removed, test view won't show up

   [window addSubview:nav.view];

   [nav release];
}
4b9b3361

Ответ 1

Эта строка:

[window addSubview:nav.view];

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

Вот почему Apple определяет методы делегатов, такие как viewDidAppear/viewWillAppear, иначе нам не понадобятся они, поскольку мы точно знаем, когда происходят эти события.

Кроме того, добавление subview, как вы сказали, действительно сохраняет представление. Он НЕ, однако сохранит контроллер вида или контроллер навигации. Поскольку контроллер навигации WILL сохраняет любые добавленные контроллеры представлений, нам не нужно поддерживать их с помощью ivar.

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

Итак, вы должны сохранить ссылку на контроллер навигации с ivar и установить его так:

self.navigationController = nav; 

Таким образом, даже несмотря на то, что nav.view содержит указатель на testViewController.view, приложение не имеет ссылки на навигационный контроллер и, соответственно, на представление. Результатом является пустой экран.


Чтобы сделать это более очевидным, что это не проблема сохранения/выпуска, вы действительно просачиваетесь следующим способом:

self.testViewController = [[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]];

Вам необходимо авторекламу, чтобы сбалансировать ваши сохраненные/выпуски:

self.testViewController = [[[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]] autorelease];

Итак, это означает, что ваш взгляд никогда не был освобожден в любое время, когда вы запустили этот код. Это еще раз подтверждает, что ваша проблема действительно потеряна.

Ответ 2

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

Без этой строки:

self.navigationController = nav

Ничего не удерживает навигационный контроллер. Было бы странно, чтобы представление перешло в прошлое.

Ответ 3

Это не похоже на вопрос о сохранении/выпуске. Вы не увидите, если вы закомментируете self.navigationController = nav;, потому что тогда в следующей строке [window addSubview:self.navigationController.view] свойство self.navigationController не будет установлено. Это, вероятно, ноль, или он сбой, но не может точно сказать, без кода.