如何从模态视图中使用托管数据上下文? (核心数据)

时间:2011-06-17 05:09:09

标签: iphone core-data modalviewcontroller

我设置了核心数据结构。在我的申请代表中,我有:

    - (void)applicationDidFinishLaunching:(UIApplication *)application
{    

    // Configure and show the window.

    RootViewController *rootViewController = [[RootViewController alloc] initWithStyle:UITableViewStylePlain];

    NSManagedObjectContext *context = [self managedObjectContext];
    if (!context) {
        // Handle the error.
    }
    rootViewController.managedObjectContext = context;

    UINavigationController *aNavigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
    self.navigationController = aNavigationController;

    [_window addSubview:[_navigationController view]];
    [_window makeKeyAndVisible];

    [rootViewController release];
}

Tl; dr :此代码设置指向我的数据的托管对象上下文的指针,然后将根视图控制器的managedObjectContext设置为其managedObjectContext。

然后,我拉出一个模态视图,让用户添加数据。但是为了保存这些数据,我需要访问managedObjectContext上下文,因为这是保存数据的方法......

foo *myFoo = (foo *)[NSEntityDescription insertNewObjectForEntityForName:@"Foo" inManagedObjectContext:managedObjectContext];

...但是如果没有访问托管对象上下文,我就无法调用它。 如何从模态视图访问rootViewController的managedObjectContext。

1 个答案:

答案 0 :(得分:3)

我遇到了这个问题,想到了两个解决方案。

  1. 将数据传递到字典中的根视图控制器(通过NSNotificationCenter)并保存。

  2. 将ManagedObjectContext(MOC)传递给模态视图控制器,让模态视图的MOC进行保存。

  3. 由于某些原因,我最终选择#2。

    • 在保存简单数据时最终会更容易。
    • 制作一个userInfo docionary很麻烦。
    • “添加实体”对话框应该能够添加实体,对吧?

    要实现这一点,在您的UIViewController子类中,只需添加如下属性:

    //... In your interface:
    NSManagedObjectContext *moc;
    
    //... beneath your interface:
    @property (nonatomic, retain) NSManagedObjectContext *moc;
    

    然后不要忘记根据需要合成和释放。接下来,在根视图中,在呈现mod视图之前传递上下文:

    //... Create Modal VC, then...
    [modalViewController setMOC:self.managedObjectContext];
    // Now, present the modal VC
    

    Boom,你的模态视图中有一个MOC。根据需要调用保存。请注意,如果您忘记传入MOC,则当您尝试执行获取请求时,您的应用程序将崩溃。