Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将NSManagedObjectContext上下文传递给ViewController的值为零_Ios_Objective C_Core Data_Nsmanagedobjectcontext - Fatal编程技术网

Ios 将NSManagedObjectContext上下文传递给ViewController的值为零

Ios 将NSManagedObjectContext上下文传递给ViewController的值为零,ios,objective-c,core-data,nsmanagedobjectcontext,Ios,Objective C,Core Data,Nsmanagedobjectcontext,我已经使用以下代码在pass中向ViewController传递了一个上下文,但由于某些原因,它在这个项目中的行为有所不同 用户执行一个操作 我按如下方式加载ViewController: ProjectListViewController *projectListViewController = [[ProjectListViewController alloc] init]; projectListViewController.context = [self context]; [self

我已经使用以下代码在pass中向ViewController传递了一个上下文,但由于某些原因,它在这个项目中的行为有所不同

  • 用户执行一个操作
  • 我按如下方式加载ViewController:

    ProjectListViewController *projectListViewController = [[ProjectListViewController alloc] init]; 
    projectListViewController.context = [self context];
    [self.view addSubview:[projectListViewController view]];
    
  • 在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];
    }
    
  • 事实证明,上下文为零

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

    ViewDidLoad方法在到达行[self.view addSubview:[projectListViewController视图]]之前就已经运行;因此,未设置上下文

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

    我认为ViewDidLoad不应该在调用addSubview之前运行,这是错误的吗


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

    -viewDidLoad
    将在需要视图之前(即需要显示视图并加载视图之后)不会被调用。我通常会在app委托中放一个方便的方法,或者一个返回上下文的单例。

    基于苹果的文档

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

    下面是发生的情况,我的ViewController调用initWithNibName。它调用的下一个方法是ViewDidLoad,这是访问ViewController的结果

    这意味着视图实际上是加载的,只是还没有添加,因此_上下文的传递发生在ViewDidLoad事件使_上下文为nil之后

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


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

    看起来没有错,但如果将NSFetchRequest代码移动到ViewWillExample中会发生什么?只是尝试了一下,这会起作用,但是没有解释为什么viewDidLoad在addSubview之前被调用。我没有任何猜测,但是如果你在viewDidLoad中放置一个断点并查看堆栈,可能会有线索。这是一个很好的建议,但我决定不使用此方法。