使用故事板从appdelegate访问一个视图控制器

3

我已经按照Ray Wendelich的教程iOS 7中使用Storyboards创建TabBarController进行了操作。

只需查看Storyboard图像即可。 Ray通过以下代码访问'playersViewcontroller'

 UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
UINavigationController *navigationController = [tabBarController viewControllers][0];
PlayersViewController *playersViewController = [navigationController viewControllers][0];

当我尝试访问playerDetailsViewController时,使用以下代码会导致崩溃。出现消息

Ratings[2630:60b] * 终止应用程序,原因是未捕获到异常'NSRangeException',原因:'* -[__NSArrayI objectAtIndex:]:索引1超出界限[0..0]' ***第一次抛出调用堆栈: (0x30b49e83 0x3aea66c7 0x30a7fff9 0x3ddd1 0x3333eaad 0x3333e4f3 0x33338b41 0x332d3a07 0x332d2cfd 0x33338321 0x357b876d 0x357b8357 0x30b14777 0x30b14713 0x30b12edf 0x30a7d471 0x30a7d253 0x333375c3 0x33332845 0x3e0fd 0x3b39fab7) libc ++ abi.dylib:终止类型为NSException的未捕获异常

代码如下:

UITabBarController *tabBarController =
(UITabBarController *)self.window.rootViewController;
UINavigationController *navigationController =
[[tabBarController viewControllers] objectAtIndex:0];
PlayersViewController *playersViewController =
[[navigationController viewControllers] objectAtIndex:0];

UINavigationController *nav=[[navigationController viewControllers]objectAtIndex:1];
PlayerDetailsViewController *playerdetailsviewcontroller=[[nav viewControllers]objectAtIndex:0];

我尝试了下面的代码:

我也试过以下代码:

UITabBarController *tabBarController =
(UITabBarController *)self.window.rootViewController;
UINavigationController *navigationController =
[[tabBarController viewControllers] objectAtIndex:0];
PlayersViewController *playersViewController =
[[navigationController viewControllers] objectAtIndex:0];
PlayerDetailsViewController *playerdetailsviewcontroller=[[navigationController viewControllers]objectAtIndex:1];

我遇到了一个带有崩溃信息的问题:

'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex_]: index 1 beyond bounds [0 .. 0]'

故障发生在storyboard图片中:enter image description here

基本上,我想从appdelegate访问PlayerdetailsViewcontroller。 我觉得我漏掉了一些东西,你有什么想法吗?


1
你能发一下你的Storyboard的屏幕截图吗?或者提供更多关于你对Storyboard所做的内容的信息。然后我会尝试回答你的问题。 - Zhans
1
我已经编辑了问题,如果你放大一点,就可以看到视图控制器的名称。 - Suraj K Thomas
2个回答

1
你的应用程序在这里崩溃了(objectAtIndex:1):
UINavigationController *nav = [[navigationController viewControllers] objectAtIndex:1];
PlayerDetailsViewController *playerdetailsviewcontroller = [[nav viewControllers]objectAtIndex:0];

这是因为 naviationController 只有一个子视图 (PlayersViewController)。如果不通过 Segue 在 PlayersViewController 中实例化 PlayerDetailsViewController,则无法在故事板中继续向下导航。 编辑 您只能访问最初可见的 ViewControllers (通过 UITabBarController 显示)。
我也不明白为什么要在 PlayersViewController 中添加另一个 UINavigationController。如果使用 Segue 将 PlayersViewController 连接到 PlayerDetailViewController,则会重用 navigationController(这是正确的做法)。

如果我按照你所说的做法,有没有办法访问视图控制器? - Suraj K Thomas
1
是的,您可以通过 PlayersViewController 访问它,并将数据从您的 AppDelegate 传递到 PlayersViewControllerPlayerDetailsViewController - Hannes
1
我用Hannes告诉我的方法解决了它,通过playerViewController而不是app delegate访问它。使用prepare for Segue方法。 - Suraj K Thomas
1
如果我使用segue连接了playersViewController和playerDetailsViewcontroller,那么有没有办法从app delegate访问playerDetailsViewController?我想要从app delegate访问它。 - Suraj K Thomas

0

看起来你从Players到Player Details有一个模态转场。因此,你可以使用PlayersViewController的presentedViewController属性,像这样:

PlayersViewController *playersViewController = [navigationController.viewControllers firstObject];
UINavigationController *secondNavigationController = playersViewController.presentedViewController;
PlayerDetailsViewController *playerDetailsViewController = [secondNavigationController.viewControllers firstObject];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接