使用选项卡控制器传递托管对象上下文

Posted

技术标签:

【中文标题】使用选项卡控制器传递托管对象上下文【英文标题】:Passing a managed object context with a tab controller 【发布时间】:2011-02-13 19:48:22 【问题描述】:

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

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

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

【问题讨论】:

我一直在采用“从我的应用程序委托的属性中获取它”的方法,它对我来说效果很好。为什么它被认为是糟糕的形式? 我的声明是基于 Apple 关于此事的文档 【参考方案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 方法中设置一个断点,你可以验证它。

以上是关于使用选项卡控制器传递托管对象上下文的主要内容,如果未能解决你的问题,请参考以下文章

选项卡栏应用程序更新实体中的共享托管对象上下文不会传播到其他选项卡

从视图控制器传递后传递的托管对象上下文为空

如何通过应用程序委托使用托管对象上下文实例化还原的视图控制器?

在托管对象上下文之间传递对象

OS X Core Data - 将托管对象上下文传递给视图控制器

当对象的上下文不同时,如何制作 NSManagedObject 的浅拷贝?