我已经使用以下代码将传递上下文传递给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];
}
事实证明_context是nil。
进行了调试,这是我找到的。
ViewDidLoad方法在它到达行之前运行[self.view addSubview:[projectListViewController view]];因此没有设定上下文。
但是如果我从视图声明中删除init那么projectListViewController.context = [self context];得到运行,因此上下文不是零。
我认为在调用addSubview之前ViewDidLoad不应该运行是不正确的?
有没有更好的方法将上下文传递给ViewController?
答案 0 :(得分:0)
-viewDidLoad
- 直到需要显示它并且在加载之后。我通常会在app委托中添加一个方便的方法,或者在返回上下文的单例中添加一个方法。
答案 1 :(得分:0)
基于Apple的文档。
当访问视图控制器的视图属性并且视图当前不在内存中时,将触发加载循环。
所以会发生这种情况,我的ViewController调用initWithNibName。由于正在访问ViewController,它调用的下一个方法是ViewDidLoad。
这意味着视图实际上已加载但尚未添加,因此_context的传递发生在ViewDidLoad事件后_context为nil。
简单的解决方案是,如果您不需要initWithNibName方法来进行任何自定义,然后以不访问View Controller的方式将其删除,因此在传递上下文并将其添加为上下文之前不会调用ViewDidLoad子视图。
我将使用Philip提出的解决方案,只是想了解原因。