Действительно ли addSubview UIView сохраняет представление? - PullRequest
12 голосов
/ 02 июня 2009

Я столкнулся с ситуацией, которая, кажется, предполагает иное. В следующем фрагменте кода, если я удалю строку: 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];
}

Ответы [ 3 ]

24 голосов
/ 02 июня 2009

Эта строка:

[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];

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

2 голосов
/ 02 июня 2009

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

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

self.navigationController = nav

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

0 голосов
/ 02 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...