3

好吧,我一遍又一遍地试图弄清楚这一点。

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

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

4

4 回答 4

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 中 ctrl 从您的 App Delegate 拖动到嵌套在选项卡栏控制器中的视图控制器,并从出现的上下文菜单中连接相关的视图控制器。

于 2011-02-24T13:02:05.407 回答
1

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

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

于 2011-02-14T18:03:18.340 回答
1

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

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

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

也可以看看

使用 UITabBarController 时如何共享 ManagedObjectContext

于 2013-01-01T00:30:58.293 回答
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
}

我希望它有帮助!罗格

于 2011-02-13T20:15:34.227 回答