如何在呈现之前设置根视图控制器的属性?

Posted

技术标签:

【中文标题】如何在呈现之前设置根视图控制器的属性?【英文标题】:How to set properties of a root view controller before being presented? 【发布时间】:2015-09-12 08:23:17 【问题描述】:

我在storyboard 中有某个UINavigationController 我从另一个视图控制器模态呈现:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UINavigationController *myNavController = [storyboard instantiateViewControllerWithIdentifier:@"myNavController"];
[self presentViewController:myNavController animated:YES completion:nil];

这个导航控制器在storyboard 中设置了另一个UIViewController 作为它的根视图控制器。我想在这个根视图控制器显示之前为其设置一些属性,但我尝试了这个:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UINavigationController *myNavController = [storyboard instantiateViewControllerWithIdentifier:@"myNavController"];
[self presentViewController:myNavController animated:YES completion:nil];
 MyRootViewController *myRootViewController = [storyboard instantiateViewControllerWithIdentifier:@"myRootViewController"];
[myRootViewController setSelectedItem:selectedItem];
[myRootViewController setDelegate:self];

但是当我尝试设置它的属性时,似乎还没有加载根视图控制器...

我怎么能这样做?谢谢

【问题讨论】:

【参考方案1】:

如果你调试过,你会发现MyRootViewController *myRootViewController = [storyboard instantiateViewControllerWithIdentifier:@"myRootViewController"]; 制作的myRootViewController并不是myNavController真正的rootViewController。

这个方法-instantiateViewControllerWithIdentifier: 只是给你一个全新的 UIViewController 实例。

所以,如果你想获得真正的 rootViewController,只需将其替换为以下内容:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UINavigationController *myNavController = [storyboard instantiateViewControllerWithIdentifier:@"myNavController"];

 MyRootViewController *myRootViewController = myNavController.viewControllers[0];
[myRootViewController setSelectedItem:selectedItem];
[myRootViewController setDelegate:self];

[self presentViewController:myNavController animated:YES completion:nil];

【讨论】:

以上是关于如何在呈现之前设置根视图控制器的属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AppDelegate 中将视图控制器设置为根视图控制器

$q defer 和 promises 以及如何使用它们在视图呈现之前为控制器加载数据

如何将对对象的引用传递给包含在导航控制器中的模态呈现的视图控制器?

如何返回根视图控制器

如何在保持导航栏存在的同时以模态方式呈现视图控制器。 (对于设置视图控制器)

如何关闭模态视图控制器,然后立即让呈现视图控制器呈现不同的模态视图控制器?