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

时间:2011-02-13 19:48:22

标签: iphone core-data nsmanagedobjectcontext

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

我知道最佳做法是让App Delegate将托管对象上下文传递给应用程序中的第一个视图控制器,然后让每个后续视图控制器传递托管对象上下文。但是,当我在我的应用程序中使用标签栏控制器时,我似乎可以绕过那个额外的层。

我能够弄清楚如何做到这一点的唯一方法是让每个标签“Reach Back”的根视图控制器进入app委托以获取上下文,但据我所知,这是糟糕的形式。

4 个答案:

答案 0 :(得分:2)

您可以使用界面构建器来实现相同的功能。

这是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中,从App Delegate拖动到嵌套在Tab Bar Controller中的View Controller,并从出现的上下文菜单中连接相关的View控制器。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

您也可以在AppDelegate中执行类似的操作:

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

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

另见

  

How to share a ManagedObjectContext when using UITabBarController

答案 3 :(得分:0)

不确定我是否正确理解了您的问题,但为什么不以同样的方式将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
}

我希望它有所帮助! ROG