将 managedObjectContext 传递给 UITabBarController 问题

Posted

技术标签:

【中文标题】将 managedObjectContext 传递给 UITabBarController 问题【英文标题】:Passing managedObjectContext to UITabBarController issues 【发布时间】:2011-04-22 21:27:56 【问题描述】:

我正在制作一个基于 Core Data 的 iPhone 应用程序来存储一些数据。

它有一个UITabBarController 作为根视图控制器(RootViewController)。标签栏控制器由应用程序委托提供了两个视图控制器 - 第一个是 UIViewController 的实例,它代表应用程序的标题屏幕,第二个是 UITableViewController,用于显示数据。

这是我第一个使用 Core Data 的 iPhone 应用程序。我读过构建此类应用程序的正确方法是在应用程序委托中创建和初始化managedObjectModelmanagedObjectContextpersistentStoreCoordinator 对象,然后通过引用将managedObjectContext 传递给子视图控制器.我就是这样做的。

但是,我没有设法将 managedObjectContext 对象传递到我在应用程序委托的 applicationDidFinishLaunching: 中初始化的标签栏控制器中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions 
    RootViewController *rootViewController = [[RootViewController alloc] init];
    rootViewController.managedObjectContext = self.managedObjectContext;
    [window addSubview:rootViewController.view];
    [window makeKeyAndVisible];
    [rootViewController release];
    return YES;

即使标签栏正确显示并加载了标题屏幕视图控制器,它的managedObjectContext 仍然为零。我无法弄清楚我做错了什么。我还尝试通过向 RootViewController 添加一个新的保留属性来传递一个字符串。

我的RootViewController.h 如下:

@interface RootViewController : UITabBarController 
@private 
NSManagedObjectContext *managedObjectContext;


@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

@end

我的 RootViewController 的 viewDidLoad 方法:

- (void)viewDidLoad 
[super viewDidLoad];

NSLog(@"%@", self.managedObjectContext);

ObiadViewController *obiadVC = [[ObiadViewController alloc] init];
ObiadListNavController *obiadListVC = [[ObiadListNavController alloc] init];

obiadVC.managedObjectContext = self.managedObjectContext;
obiadListVC.managedObjectContext = self.managedObjectContext;

NSArray *vcs = [NSArray arrayWithObjects:obiadVC, obiadListVC, nil];

self.viewControllers = vcs;

[obiadVC release];
[obiadListVC release];

我还检查了应用程序委托中的managedObjectContext 不为零,就在它被传递给RootViewController 实例之前。就像RootViewController 的所有 ivars 都被重置了。它只发生在这一点上。当我稍后将一个字符串从表视图控制器传递到详细视图控制器时,一切都很好。

我希望我说清楚了。我现在感觉很迷茫。

【问题讨论】:

什么是 NSLog(@"%@", self.managedObjectContext); TabBarController.m 中的输出?如果它为 nil,那么您实际上是在将 managedObjectContext 设置为 nil。 obiadVC.managedObjectContext = self.managedObjectContext; 不应该是 obiadVC.managedObjectContext = self.delegate.managedObjectContext; 吗? 不是RootViewController *rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil] 而是一个简单的alloc/init?; 【参考方案1】:

UITabBarController Class Reference 明确指出 UITabBarController 不应该被子类化:

这个类不用于子类化。

在这种情况下,您可以实例化您的 UITabBarController 并在您的 App Delegate 的 applicationDidFinishLaunching 中添加视图控制器:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    tabBarController = [[UITabBarController alloc] init];

    FirstViewController *firstViewController = [[FirstViewController alloc] init];
    SecondViewController *secondViewController = [[SecondViewController alloc] init];

    firstViewController.managedObjectContext = self.managedObjectContext;
    secondViewController.managedObjectContext = self.managedObjectContext;

    NSArray *vcs = [NSArray arrayWithObjects:firstViewController, secondViewController, nil];
    tabBarController.viewControllers = vcs;

    [window addSubview:tabBarController.view];
    [window makeKeyAndVisible];

    [firstViewController release];
    [secondViewController release];

    return YES;

希望对你有帮助。

【讨论】:

您将如何使用情节提要做到这一点?因为您无法以编程方式访问您的视图控制器,或者更确切地说,没有必要。

以上是关于将 managedObjectContext 传递给 UITabBarController 问题的主要内容,如果未能解决你的问题,请参考以下文章

将 ManagedObjectContext 传递/注入到视图控制器中

如果它是子视图控制器,如何将 AppDelegate 中的 managedObjectContext 传递给正确的视图控制器?

将 NSManagedObject 重新插入到 ManagedObjectContext

在核心数据的类之间传递 managedObjectContext 时出错

在没有 managedObjectContext 的视图之间传递 CoreData 对象

“Appdelegate”没有可见的@interface 声明选择器“managedObjectContext”