Ios 将NSManagedObjectContext上下文传递给ViewController的值为零
我已经使用以下代码在pass中向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
ProjectListViewController *projectListViewController = [[ProjectListViewController alloc] init];
projectListViewController.context = [self context];
[self.view addSubview:[projectListViewController view]];
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];
}
是否有更好的方法将上下文传递给ViewController?
-viewDidLoad
将在需要视图之前(即需要显示视图并加载视图之后)不会被调用。我通常会在app委托中放一个方便的方法,或者一个返回上下文的单例。基于苹果的文档
当访问视图控制器的视图属性且视图当前不在内存中时,将触发加载循环
下面是发生的情况,我的ViewController调用initWithNibName。它调用的下一个方法是ViewDidLoad,这是访问ViewController的结果
这意味着视图实际上是加载的,只是还没有添加,因此_上下文的传递发生在ViewDidLoad事件使_上下文为nil之后
简单的解决方案是,如果不需要initWithNibName方法进行任何自定义,那么就删除它,这样就不会访问视图控制器,因此在传递上下文并将其作为子视图添加之前不会调用ViewDidLoad
我将使用Philip提出的解决方案,只是想了解原因。看起来没有错,但如果将NSFetchRequest代码移动到ViewWillExample中会发生什么?只是尝试了一下,这会起作用,但是没有解释为什么viewDidLoad在addSubview之前被调用。我没有任何猜测,但是如果你在viewDidLoad中放置一个断点并查看堆栈,可能会有线索。这是一个很好的建议,但我决定不使用此方法。