【问题标题】:Passing a managed object context with a tab controller使用选项卡控制器传递托管对象上下文
【发布时间】:2023-03-14 06:05:01
【问题描述】:

好的,我一遍又一遍地尝试解决这个问题。

我知道最佳实践是让 App Delegate 将托管对象上下文传递给应用程序中的第一个视图控制器,然后让每个后续视图控制器向下传递托管对象上下文。但是,当我在我的应用程序中使用选项卡栏控制器时,我似乎会绕着那个额外的层转头。

我能够弄清楚如何做到这一点的唯一方法是将每个选项卡“Reach Back”的根视图控制器放入应用程序委托中以获取上下文,但据我了解,这是一种糟糕的形式。

【问题讨论】:

  • 我一直在采用“从我的应用程序委托的属性中获取它”的方法,它对我来说效果很好。为什么它被认为是糟糕的形式?
  • 我的声明是基于 Apple 关于此事的文档

标签: iphone core-data nsmanagedobjectcontext


【解决方案1】:

您可以使用界面生成器来实现相同的目的。

这里是 Rog 原始建议的略微修改(为了更清楚起见)版本 - 请注意 IBOutlet 的

@interface AppDelegate : NSObject <UIApplicationDelegate> {
    ViewController1 *vc1;
    ViewController2 *vc2;
    ViewController3 *vc3;
}

@property (nonatomic, retain) IBOutlet ViewController1 *vc1;
@property (nonatomic, retain) IBOutlet ViewController2 *vc2;
@property (nonatomic, retain) IBOutlet ViewController3 *vc2;

然后在实现文件上:

- (void)applicationDidFinishLaunching:(UIApplication *)application {
       vc1.managedObjectContext = self.managedObjectContext;
       vc2.managedObjectContext = self.managedObjectContext;
       vc3.managedObjectContext = self.managedObjectContext;
       // Continue with your implementation logic
}

然后从 Interface Builder 中 ctrl 从您的 App Delegate 拖动到嵌套在 Tab Bar Controller 中的 View Controller 并从出现的上下文菜单中连接相关的 View Controller。

【讨论】:

    【解决方案2】:

    最后,关键是不要依赖界面构建器来构建标签栏控制器。通过在代码中手动执行此操作,我可以轻松地将托管对象上下文传递给视图控制器,因为我在 applicatoinDidFinishLaunchingWithOptions 中创建它们:

    我以这篇文章为基础:http://www.iphonelife.co.uk/creating-a-uitabbarcontroller-programmatically/

    【讨论】:

      【解决方案3】:

      你也可以在你的 AppDelegate 中做这样的事情:

      CoreDataUsingViewController *vc = (CoreDataUsingViewController *)[[tabBarController viewControllers] objectAtIndex:1];
      vc.managedObjectContext = self.managedObjectContext;
      

      我正在将 coreData 添加到具有几个不同构建目标的现有项目中,并且不想从头开始重新创建所有不同的 UITabBarController。这样做很容易,但我不确定这是否是最巧妙的方法。

      另见

      How to share a ManagedObjectContext when using UITabBarController

      【讨论】:

        【解决方案4】:

        不确定我是否正确理解了您的问题,但为什么不简单地将 MOC 以相同的方式传递给其他视图控制器?这是一个例子:

        @interface AppDelegate : NSObject <UIApplicationDelegate> {
            ViewController1 *vc1;
            ViewController2 *vc2;
            ViewController3 *vc3;
        }
        
        // Declare properties as per normal
        

        然后在实现文件上:

        - (void)applicationDidFinishLaunching:(UIApplication *)application {
               vc1.managedObjectContext = self.managedObjectContext;
               vc2.managedObjectContext = self.managedObjectContext;
               vc3.managedObjectContext = self.managedObjectContext;
               // Continue with your implementation logic
        }
        

        希望对你有帮助! 罗格

        【讨论】:

        • 这样做并不能完全解决我遇到的问题,因为 UITabController 实例正在运行时创建 MyCustomViewController 的新实例,因此以这种方式设置 MOC 会将其设置为永远不会被使用的对象。
        • 我很确定与标签栏控制器关联的视图控制器是在创建 tabBarController 时实例化的。他们的视图会根据需要加载,但在applicationDidFinishLaunching,您已经可以访问视图控制器以按照上述方式设置变量。在你的 applicationDidFinishLaunching 方法中设置一个断点,你可以验证它。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多