Эта строка:
[window addSubview:nav.view];
НЕ добавляет вид на экран немедленно. Он отображается ОС в будущем цикле выполнения в другом потоке. Фактическая реализация, в которой мы не можем быть уверены.
Именно поэтому Apple определяет методы делегатов, такие как viewDidAppear / viewWillAppear, иначе они бы нам не понадобились, поскольку мы точно знали бы, когда происходят эти события.
Более того, добавление подпредставления, как вы сказали, действительно сохраняет представление. Однако он НЕ сохраняет контроллер вида или контроллер навигации. Поскольку навигационный контроллер WILL сохранит все добавленные контроллеры представления, нам не нужно поддерживать их с помощью ивара.
Но ваша ссылка на контроллер навигации должна сохраняться вне рамок метода. или, в зависимости от вашего кода, он может быть освобожден или его ссылка потеряна.
Таким образом, вы должны сохранить ссылку на контроллер навигации с помощью ивара и установить ее так:
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];
Таким образом, это означает, что ваше представление никогда не было отменено ни разу, когда вы запускали этот код. Что еще больше убеждает нас в том, что ваша проблема действительно утрачена.