0

我已经使用以下代码将上下文传递给传递中的 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 为零。

做了一个调试,这是我发现的。

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

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

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

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

4

2 回答 2

0

-viewDidLoad在需要视图之前不会被调用 - 也就是说,直到它需要显示并且在它加载之后。我通常会在应用程序委托或返回上下文的单例中放置一个便利方法。

于 2012-04-29T13:57:59.633 回答
0

基于 Apple 的文档。

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

所以这就是发生的事情,我的 ViewController 调用了 initWithNibName。由于访问了 ViewController,它调用的下一个方法是 ViewDidLoad。

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

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

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

于 2012-05-01T12:49:51.190 回答