将NSManagedObjectContext上下文传递给ViewController是nil

时间:2012-04-29 13:45:02

标签: ios objective-c core-data nsmanagedobjectcontext

我已经使用以下代码将传递上下文传递给ViewController而没有问题,但由于某种原因,它对这个项目的行为有所不同。

  1. 用户执行操作
  2. 我像这样加载ViewController:

    ProjectListViewController *projectListViewController = [[ProjectListViewController alloc] init]; 
    projectListViewController.context = [self context];
    [self.view addSubview:[projectListViewController view]];
    
  3. 在viewDidLoad方法中,我有以下内容:

    if (_context != nil) {
    
       NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
       NSEntityDescription *entity = [NSEntityDescription
            entityForName:@"Project" inManagedObjectContext:_context];
    
       [fetchRequest setEntity:entity];
       NSError *error;
       self.projects = [_context executeFetchRequest:fetchRequest error:&error];
    }
    
  4. 事实证明_context是nil。

  5. 进行了调试,这是我找到的。

    ViewDidLoad方法在它到达行之前运行[self.view addSubview:[projectListViewController view]];因此没有设定上下文。

    但是如果我从视图声明中删除init那么projectListViewController.context = [self context];得到运行,因此上下文不是零。

    我认为在调用addSubview之前ViewDidLoad不应该运行是不正确的?

    有没有更好的方法将上下文传递给ViewController?

2 个答案:

答案 0 :(得分:0)

在需要视图之前不会调用

-viewDidLoad - 直到需要显示它并且在加载之后。我通常会在app委托中添加一个方便的方法,或者在返回上下文的单例中添加一个方法。

答案 1 :(得分:0)

基于Apple的文档。

  

当访问视图控制器的视图属性并且视图当前不在内存中时,将触发加载循环。

所以会发生这种情况,我的ViewController调用initWithNibName。由于正在访问ViewController,它调用的下一个方法是ViewDidLoad。

这意味着视图实际上已加载但尚未添加,因此_context的传递发生在ViewDidLoad事件后_context为nil。

简单的解决方案是,如果您不需要initWithNibName方法来进行任何自定义,然后以不访问View Controller的方式将其删除,因此在传递上下文并将其添加为上下文之前不会调用ViewDidLoad子视图。

我将使用Philip提出的解决方案,只是想了解原因。