Ответ 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];
Итак, это означает, что ваш взгляд никогда не был освобожден в любое время, когда вы запустили этот код. Это еще раз подтверждает, что ваша проблема действительно потеряна.