以模态方式呈现UINavigationController - 在根视图控制器viewDidLoad中设置工具和导航栏项目的问题

时间:2011-03-17 08:05:01

标签: iphone uinavigationcontroller modalviewcontroller

在我的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];

我遇到的问题是这些物品没有显示出来。相反,我从MyViewController的viewDidLoad方法调用一个方法,该方法通过performSelector:withObject:afterDelay:0添加工具栏项,然后它完美地工作。因此,显然会出现一些竞争条件,包括UINavigationController的初始呈现,工具栏/导航栏的初始化以及导航栏指定的初始根视图控制器的初始化。

我在调试器中验证了在UINavigationController的viewDidLoad方法之后调用根视图控制器的viewDidLoad。实际上,在调用presentModalViewController:之前不会调用根视图控制器的viewDidLoad方法,并且在initWithRootViewController中调用UINavigationController的viewDidLoad,所以这并不意味着UINavigationController对象应该“准备就绪”,包括其导航栏和工具栏?

我首先想到导航控制器的工具栏对象在MyViewController的viewDidLoad时间可能还不存在,但显然确实如此。至少,NSLog在MyViewController的viewDidLoad方法中显示它不是nil。实际上,UINavigationController的工具栏对象在两个时间都是相同的:在根视图控制器的viewDidLoad中,以及我使用performSelector调用的“setupToolbar”方法:withObject:afterDelay,因此它不会以某种方式“重新初始化”。

那么,这里发生了什么?为什么我的工具栏修改不会“粘贴”在MyViewController的viewDidLoad中,为什么在runloop的下一次迭代中执行它们(performSelector:withObject:afterDelay:0)使它工作?

从UINavigationController的rootViewController在代码中设置初始导航栏/工具栏项的“正确”方法是什么?

编辑:我发现了“发生了什么”,虽然我仍然不理解“为什么”:在MyViewController的viewDidLoad方法返回之后(我已经验证了导航控制器的工具栏的items数组是非零的)在下一个runloop迭代之前/之前的某个时间(或者每当调用performSelector:withObject:afterDelay:0时),导航控制器工具栏的items属性设置为nil!

编辑:调用[self.navigationController setToolbarItems:animated:]时的同样问题

编辑:已解决,正确的方法是[self setToolbarItems:animated:],而不是[self.navigationController setToolbarItems:animated:],谢谢!

1 个答案:

答案 0 :(得分:2)

这里只是一个猜测,但你尝试过使用

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

从MyViewController的viewDidLoad方法中?我不确定这是否是像你一样直接访问导航控制器工具栏的正确方法。至少API陈述

  

UIViewController类参考

...

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

...

  

由导航控制器管理的视图控制器可以使用此方法为导航控制器的内置工具栏指定工具栏项。您可以在显示视图控制器之前或在视图控制器可见之后为视图控制器设置工具栏项。