移交managedObjectContext的问题

时间:2012-08-07 02:57:04

标签: objective-c ios5 core-data nsmanagedobjectcontext

我一直在阅读关于这个项目的大多数问题,但不知怎的,我无法想出这个问题。

我轻松地将ManagedObjectContext从AppDelegate移交给我尝试的先前应用程序中的第一个视图,其中初始viewController也处理了数据。

现在在我正在构建的新应用程序中,我需要一个初始屏幕,用户需要进行选择(通过几个可能的按钮)。在这个屏幕上,根据我的故障排除,我的MOC仍然完好无损(NSLog消息为我提供了MOC的有效地址)。

选择完成后,应用程序将继续执行带有TableView的UIViewController。在这个视图中,我应该能够管理我的数据,但我的MOC返回nil。

应用程序通过UINavigationController进入下一个视图。

我在AppDelegate中加入了以下代码:

UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
InitialViewController *controller = (InitialViewController *)navigationController.topViewController;
controller.managedObjectContext = self.managedObjectContext;
return YES;

InitialViewController是FIRST ViewController,一切都还可以。

下一个viewcontroller被称为MasterViewController,是NSFetchedControllerDelegate。在这里,我似乎无法访问NOC。我已经尝试过在同一主题的先前问题中提出的几种方法和解决方案,但似乎都没有。

如何使用正确的编码让NOC在MasterViewController中工作?

哦,是的,其中一个解决方案是在MasterViewController中的ViewDidLoad之后,我插入以下代码:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
self.managedObjectContext = appDelegate.managedObjectContext;

我的MOC现已上市,但这是正确的方法吗?

2 个答案:

答案 0 :(得分:0)

如果您使用的是Storyboard,

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    [super prepareForSegue:segue sender:sender];
    if ([[segue identifier] isEqualToString:@"segueNameOfPresentingYourModalViewController"] == YES) {
        UINavigationController *navigationController = segue.destinationViewController;
        YourCustomViewController *aController = (YourCustomViewController *)navigationController.topViewController;
        aController.managedObjectContext = self.managedObjectContext;
    }
    else if ([segue.identifier isEqualToString:@"segueNameOfPushingYourViewController"] == YES) {
        YourCustomViewController *aController = segue.destinationViewController;
        aController.managedObjectContext = self.managedObjectContext;
    }
}

如果您没有使用Storyboard,则类似地设置视图控制器的managedObjectContext,您将在其中推送或呈现它。另一个常见的地方是-tableView:didSelectRowAtIndexPath:方法。

答案 1 :(得分:-1)

你写" controller.managedObjectContext"所以你清楚地向InitialViewController添加了一个NSManagedObjectContext *属性。您只需要向MasterViewController添加相同的属性,并为其分配self.managedObjectContext。

如果您不想将moc添加到每个控制器,那么简单地为您的MOC声明一个全局变量没有错:

在appDelegate.h中:

extern NSManagedObjectContext* moc;

现在任何.m都有:

#import "AppDelegate.h"

可以访问moc。您也可以只在appDelegate中添加一个属性,然后在每个控制器中添加:

AppDelegate* app = (AppDelegate*)[[UIApplication sharedApplication] delegate];
app.managedObjectContext