从Storyboard实例化UIViewController时,无法从AppDelegate更改UI

时间:2012-02-19 23:40:25

标签: objective-c ios5 storyboard

我需要从AppDelegate设置一些UIViewController的UI元素。我使用了Storyboard,因此UIViewController不会在AppDelegate中初始化。

我尝试使用:

获取UIViewController的实例
UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:[NSBundle mainBundle]];
TableViewController* myTableViewController = [storyboard instantiateViewControllerWithIdentifier:@"myTableViewController"]; 

但是当我尝试设置一些UI元素,如UINavigationBar的UIBarButtonItem时,就像这里:

UIBarButtonItem* refreshButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshEntry)];
    myTableViewController.navigationItem.rightBarButtonItem = refreshButton;

UINavigationBar保持空白且UIBarButtonItem不显示...

如何更改用户界面?

1 个答案:

答案 0 :(得分:5)

不幸的是,据我所知,Storyboard无法插入应用代理。因此,您无法直接获取应用委托生命周期方法中视图控制器的句柄来执行其他工作。

但是,您知道app delegate的windows'rootViewController属性将是您在Storyboard中指定的初始视图控制器。所以你总是可以这样做:

XXRootViewController *rootViewController = (XXRootViewController *)self.window.rootViewController;
[rootViewController doAdditionalWork];

此外,在Storyboard上调用-instantiateViewControllerWithIdentifier:不起作用的原因是,因为它实际上是在实例化一个新的视图控制器。但是,您在Storyboard文件中设置的视图控制器层次结构是应用程序启动时实际取消存档的内容。因此,您可以有效地实例化该视图控制器,对其进行一些更改,然后将其解除分配。