【问题标题】:Get storyboard-defined UINavigationController from AppDelegate从 AppDelegate 获取故事板定义的 UINavigationController
【发布时间】:2013-08-25 16:34:16
【问题描述】:

在故事板中,我有一个介绍性的视图控制器,它会淡入 UINavigationController。

      |   |      |   |
   -> |   |  ->  |   |     
      |   |      |   |
     ViewCtrl   NavCtrl

我想从应用程序委托中获取对导航控制器的引用(就像 @Guillaume 答案在 this question 中所做的那样)。

这是我尝试访问它的方式:

UIApplication.sharedApplication.delegate.window.rootViewController.navigationController;

但是导航控制器是 nil。

任何概念为什么 navController 是 nil 或者我可以做些什么来获得对它的引用?

【问题讨论】:

  • 您是否为 UINavigationController 设置了 Storyboard ID?如果没有,您应该在 Storyboard 中执行此操作。之后,您不需要所有这些来访问您的导航控制器。您只需要 [self.storyboard instantiateViewControllerWithIdentifier:@"myID"]。我假设你从你的视图控制器调用它。要访问您想要的导航控制器,只有当您的 rootViewController 在 UINavigationController 中时才有可能。
  • 谢谢@rocir!这看起来很有希望。我唯一的反对意见是应该已经实例化了一个 UINavigationController,并且我想获得对那个的引用。我不认为我想实例化第二个导航控制器。
  • 但是你这样做你不会成功,因为你的 rootViewController 不在 UINavigationController 中。此外,此时 UIViewController 尚未实例化。所以你有什么连接这两个视图控制器的segue?
  • 尝试访问导航控制器的代码在一些控制器被推送到导航控制器之前不会运行(因此它将被实例化)。知道@Guillaume 如何在我在问题中链接到的示例中使用它吗?
  • 据我所知,您无法从 ViewCtrl 访问它,因为它不在 NavCtrl 中。这可以在导航控制器内具有 rootViewController 的应用程序中工作。我不确定他的代码是否以这种方式工作。如果你真的想要这样做,我建议在 AppDelegate 中创建一个属性(如 navigationController),并在第一次初始化时设置它。之后,您只需访问此属性即可获取它。

标签: iphone ios objective-c uinavigationcontroller storyboard


【解决方案1】:
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
                                                         bundle: nil];

UINavigationController *controller = (UINavigationController*)[mainStoryboard 
                    instantiateViewControllerWithIdentifier: @"<Controller ID>"];

您在导航控制器的属性检查器中指定导航控制器的控制器标识符。

【讨论】:

  • 它在“身份检查器”中(左起第三个)。
  • 这将每次返回一个新的导航控制器实例
  • @MohamedElkassas 完全正确。从情节提要中获取任何控制器每次都是“实例化”新对象。情节提要中没有“共享实例”之类的东西。如果你想要这样的共享实例,你应该在 appdelegate 上实例化一次,然后通过 appdelegate 从你应用中的任何地方访问它。
  • 这将每次返回一个新的导航控制器实例
【解决方案2】:

所以 Arsen 的解决方案看起来不错,但我不知道如何获得故事板的名称,哈哈。对我有用的是

UINavigationController *navigationController = (UINavigationController*)_window.rootViewController;
AVDashboardViewController *dashBoardViewController =
(AVDashboardViewController*)[navigationController.viewControllers  objectAtIndex:1];//since on index 0 I have my login screen and index 1 is the home screen

在 AppDelegate 上获取 NavigationController 的引用似乎是不好的编码习惯,但在我的情况下,我需要它,因为它是

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 

被定位,这是接收到Notification时调用的方法之一。收到消息后,我还在为如何更新导航控制器而苦苦挣扎,所以可能跑题了,但这里有一个免费提示:

UIBarButtonItem *notiButton = [[UIBarButtonItem alloc] initWithTitle: @"Received push!" style: UIBarButtonItemStyleBordered target:self action:nil];

[[dashBoardViewController navigationItem] setLeftBarButtonItem:notiButton animated:YES];

[navigationController popToViewController:dashBoardViewController animated:YES];

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2013-03-06
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    相关资源
    最近更新 更多