【问题标题】:iOS - Accessing viewControllers on storyboard from appDelegateiOS - 从 appDelegate 访问情节提要上的视图控制器
【发布时间】:2013-05-23 05:16:31
【问题描述】:

我有一个使用 Core Data 的应用程序,我在应用程序委托中创建了一个 managedObjectContext。

我想将 managedObjectContext 传递给我故事板上的两个视图控制器,以便它们使用相同的 managedObjectContext 来保存和获取。

我可以通过以下方式访问第一个视图控制器:

self.window.rootViewController

但是我要访问的第二个视图控制器是在第一个视图控制器之后,并且没有从它返回任何引用。

我试过了:

instantiateViewControllerWithIdentifier:

但这会创建视图的新实例,而不是允许我访问出现在 segue 之后的第二个视图控制器。

所以我的问题是,如何访问第二个视图控制器?

或者(因为我对此很陌生)有没有更好的方法来管理/在视图控制器之间传递数据?

提前致谢。

【问题讨论】:

    标签: iphone ios core-data storyboard viewcontroller


    【解决方案1】:

    或者(因为我对此很陌生)有没有更好的方法来管理/在视图控制器之间传递数据?

    这取决于您尝试传递的数据。在这种情况下,您希望让视图控制器访问您的 Core Data 托管对象上下文。因为这是您在应用程序的整个生命周期中都需要的东西,所以最好让您的视图控制器通过您的应用程序委托访问它。

    您可以通过[[UIApplication sharedApplication] delegate] 执行此操作 - 但是,您可能需要对其进行类型转换以避免编译器警告,或者您可能希望创建一个返回托管对象上下文的宏以节省您的时间并简化您的代码更具可读性。

    如果您在创建项目时告诉 XCode 您想使用 Core Data,您应该已经在您的应用委托中拥有检索对象上下文的方法。如果没有,您需要创建它们。

    要创建一个宏以节省您每次需要访问托管对象上下文时都必须写出[[UIApplication sharedApplication] delegate],请查看以下答案:Short hand for [[UIApplication sharedApplication] delegate]?

    【讨论】:

    • 谢谢,@lxt 我在应用委托中有标准方法。因此,更好的结构方法是在视图中使用[[UIApplication sharedApplication] delegate] 来访问应用程序委托,然后调用xcode 预先编写的- (NSManagedObjectContext *)managedObjectContext 方法,以便它们都从同一个上下文中获取/保存?
    • 是的,没错。但为了节省您的时间,您可能需要创建一个宏。我将更新我的答案,向您展示如何做到这一点。
    • 再次感谢,@lxt 因此,按照您添加的链接中接受的答案的格式,我会将#define AppDelegate (YourAppDelegate *)[[UIApplication sharedApplication] delegate] 添加到我的 AppDelegate.h 中,然后在任何视图控制器中我可以简单地调用NSManagedObjectContext *managedObjectContext = [AppDelegate managedObjectContext]?
    • 工作。谢谢!非常优雅的解决方案。
    【解决方案2】:

    你可以通过这个:-

      UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
      MasterViewController *result;
    
    //check to see if navbar "get" worked
       if (navigationController.viewControllers) {
    
    //look for the nav controller in tab bar views 
          for (UINavigationController *view in navigationController.viewControllers) {
    
        //when found, do the same thing to find the MasterViewController under the nav controller
             if ([view isKindOfClass:[UINavigationController class]])
                 for (UIViewController *view2 in view.viewControllers) 
                     if ([view2 isKindOfClass:[MasterViewController class]])                    
                         result = (MasterViewController *) view2;
    
    
          }
       }
    

    【讨论】:

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