Представление UINavigationController модально - проблема с настройкой инструментов и элементов панели навигации в корневом представлении контроллера viewDidLoad - PullRequest
1 голос
/ 17 марта 2011

В моем iOS-приложении я создаю и представляю UINavigationController модально, например:

MyViewController *myvc = [[[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil] autorelease];
UINavigationController *navVC = [[[UINavigationController alloc] initWithRootViewController:myvc] autorelease];
[self presentModalViewController:navVC animated:YES];

В MyViewController viewDidLoad я создаю и устанавливаю элементы панели инструментов для панели инструментов контроллера навигации, например, так:

self.navigationController.toolbar.items = [NSArray arrayWithObjects:(items...), nil];

Проблема в том, что предметы не отображаются.Если вместо этого я вызываю метод из метода viewDidLoad MyViewController, который добавляет элементы панели инструментов с помощью executeSelector: withObject: afterDelay: 0, то он работает отлично.Таким образом, очевидно, что здесь происходит некоторое состояние гонки с начальным представлением UINavigationController, инициализацией его панели инструментов / панели навигации и инициализацией указанного начального корневого контроллера представления панели навигации.

Я убедился в отладчике, чтоviewDidLoad контроллера корневого представления вызывается после метода viewDidLoad UINavigationController.Фактически, метод viewDidLoad контроллера корневого представления не вызывается до тех пор, пока не будет вызван presentModalViewController: и viewDidLoad UINavigationController не будет вызван в initWithRootViewController, поэтому это не означает, что объект UINavigationController должен быть «готов к работе», включая его панель навигациии панели инструментов?

Сначала я подумал, что объект панели инструментов контроллера навигации может еще не существовать во время viewDidLoad MyViewController, но он явно существует.По крайней мере, NSLog показывает, что это не ноль во время метода viewDidLoad MyViewController.Фактически, объект панели инструментов UINavigationController идентичен в обоих случаях: в viewDidLoad контроллера корневого представления и в методе «setupToolbar», который я вызвал с executeSelector: withObject: afterDelay, так что он каким-то образом не «повторно инициализируется».

Итак, что здесь происходит?Почему мои изменения панели инструментов не «залипают» в viewDidLoad MyViewController и почему их выполнение на следующей итерации runloop (executeSelector: withObject: afterDelay: 0) не заставляет его работать?

Что такое «право»"способ установки начальных элементов панели навигации / панели инструментов в коде из rootViewController из UINavigationController?

Редактировать: хорошо, я понял, что происходит, хотя я до сих пор не понимаю, почему: после того, как MyViewController возвращает метод viewDidLoad (где я убедился, что массив элементов панели инструментов контроллера навигации не являетсяnil) и когда-нибудь до / в следующей итерации цикла выполнения (или всякий раз, когда вызывается executeSelector: withObject: afterDelay: 0), свойство items панели инструментов контроллера навигации устанавливается на nil!

Редактировать: та же проблема, когдавызов [self.navigationController setToolbarItems: animated:]

Редактировать: решено, правильный путь - [self setToolbarItems: animated:], а не [self.navigationController setToolbarItems: animated:], спасибо!

1 Ответ

2 голосов
/ 17 марта 2011

Просто предположение, но вы пытались использовать

[self setToolbarItems:[NSArray arrayWithObjects:(items...), nil] animated:NO];

из метода viewDidLoad MyViewController?Я не уверен, что это правильный способ прямого доступа к панели инструментов контроллера навигации, как вы это сделали.По крайней мере, API сообщает

Ссылка на класс UIViewController

...

- (void)setToolbarItems:(NSArray *)toolbarItems animated:(BOOL)animated

...

Контроллеры представления, управляемые контроллером навигации, могут использовать этот метод для указания элементов панели инструментов для встроенной панели инструментов контроллера навигации.Вы можете установить элементы панели инструментов для вашего контроллера представления до его отображения или после того, как он уже виден.

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