【问题标题】:Access a view controller from appdelegate using storyboard使用情节提要从 appdelegate 访问视图控制器
【发布时间】:2014-02-17 20:31:45
【问题描述】:

我遵循了这个 Ray Wendelich 教程 RayWenderlichTutorial Tabbarcontroller using storyboards

只需查看故事板图像。 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',原因:'*** -[__NSArrayI objectAtIndex:]:索引 1 超出范围 [0 .. 0]'

故事板图像

基本上我想从 appdelegate 访问 PlayerdetailsViewcontroller。 我想我错过了什么,有什么想法吗?

【问题讨论】:

  • 你能张贴你的故事板屏幕吗?或者更多信息你用你的故事板做了什么。那我试试回答你的问题
  • 我已经编辑了这个问题,如果你放大一点你可以看到视图控制器的名称

标签: ios7 uinavigationcontroller storyboard uitabbarcontroller appdelegate


【解决方案1】:

您的应用在此处崩溃 (objectAtIndex:1):

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

这是因为 naviationController 只有 1 个子视图 (PlayersViewController)。如果不通过 Segue 在 PlayersViewController 中实例化 PlayerDetailsViewController,您将无法继续深入故事板。

编辑 您只能访问最初可见的ViewControllers(通过UITabBarController)。

我也不明白您为什么要在 PlayersViewController 中添加另一个 UINavigationController。如果您使用 Segue 将 PlayersViewController 连接到 PlayerDetailViewController,则 navigationController 将被重用(这是正确的做法)。

【讨论】:

  • 如果我按照您所说的进行上述操作,有什么方法可以访问视图控制器吗?
  • 是的,您可以通过PlayersViewController 访问它,还可以将数据从您的AppDelegate 传递到PlayersViewController 和PlayerDetailsViewController
  • 是的,我用 Hannes 所说的解决了它,通过 playerViewController 而不是 app delegate 访问它。UJSed 为 Segue 方法做准备
  • 如果我使用 segue 连接了 playerViewController 和 playerDetailsViewcontroller,有什么方法可以从应用程序委托访问 playerDeatailsViewcontroller。?我想从应用代理访问。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2013-05-23
    • 2014-05-04
    • 2013-10-21
    • 2018-12-25
    • 2015-07-05
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    相关资源
    最近更新 更多