如果我将 managedObjectContext 设置为使用属性,则为 null,但如果我将其设置为链式控制器,则为非 null

Posted

技术标签:

【中文标题】如果我将 managedObjectContext 设置为使用属性,则为 null,但如果我将其设置为链式控制器,则为非 null【英文标题】:managedObjectContext is null if I set it as using property, but non-null if I set it as chained controller 【发布时间】:2014-01-25 10:50:40 【问题描述】:

如果我使用以下代码将 AppDelegate 的 managedObjectContext 设置为 firstViewController,这只是 AppDelegate.mapplication: didFinishLaunchingWithOptions 方法中 UITableViewController 的子类,


    rootTabBarController *rootabbarcontroller = (rootTabBarController *)self.window.rootViewController;

    UINavigationController *navigationController = [[rootabbarcontroller viewControllers] objectAtIndex:0];
    FirstViewController *firstViewController = [[navigationController viewControllers] objectAtIndex:0];

    firstViewController.managedObjectContext = self.managedObjectContext;

然后运行模拟器,FirstViewController.mviewDidLoad 方法中managedObjectContext 的值设置为非空,因此Core Data 可以正常工作。

但是,当我尝试在application: didFinishLaunchingWithOptions: 方法中编写以下代码时:


_firstViewController.managedObjectContext = self.managedObjectContext;

并运行模拟器,FirstViewController.mviewDidLoad 方法中的结果managedObjectProperty 值设置为null

所以我想知道为什么第一个实现(从根 UITabBarController 链接到根 UINavigationController 再到 FirstViewController)在其 viewDidLoad: 方法中工作,但后者(直接设置为其属性)不能。

值得注意的是,当我尝试以后一种方式实现时,我在AppDelegate.h 中声明了@property (nonatomic, strong) FirstViewController *firstViewController;。还将其类设置为情节提要中适当的视图控制器。

我已经阅读了一些博客以采用后一种方法(链接不方便,抱歉),因此可以采用后一种方法来正确设置其 managedObjectContext 值并将 Core Data 与 UITableView 合成。

那么我错过了什么?仅采用后一种方法是否可行(这可以为我节省大量编码和潜在的意外错误)?最后,哪种方法更好?

我使用 Xcode 5 和 ios 7,谢谢。

[更新]

如果我尝试按照 Almas 在以下答案中的建议添加以下行,

self.firstViewController = firstViewController;

然后我得到一个编译错误,因为那里没有定义 firstViewController

所以我添加了 firstViewController 的初始化,通过在上面一行添加下面一行。

FirstViewController *firstViewController = [[FirstViewController alloc] init];

然后AppDelegate.m看起来工作正常,但这一次,FirstViewController.mviewDidLoad方法出现错误,和我第一次报告的一样。

【问题讨论】:

您是否尝试过使用NSLog 来查看rootTabBarControllernavigationControllerfirstViewController 的值在-application:didFinishLaunchingWithOptions: 中是什么? 是的,我试过了。这些都没有返回 null - 毕竟,如果其中任何一个返回 null 我什至无法正确运行模拟器,对吧? 【参考方案1】:

在设置托管对象上下文之前,您是否将局部变量 firstViewController 设置为 ivar/property?

添加:

self.firstViewController = firstViewController;
// or
_firstViewController = firstViewController;

之前:

_firstViewController.managedObjectContext = self.managedObjectContext;

【讨论】:

这不是@property (nonatomic, strong) FirstViewController 试图做的,对吧?还是@property 不够,我还要写你建议的代码? 是的,你用@property 声明了它。现在你需要设置它。 我更新了我的问题以反映您的回答,但不幸的是事情没有改变...... @user2360798 你在哪里创建 UINavigationController 和 UITabBarController?你不介意发布整个application: didFinishLaunchingWithOptions: 方法吗? 那些在application: didFinishLaunchingWithOptions: 方法中。并且使用 UINavigationController 和 UITabBarController 的方式按预期工作,只是想知道为什么在设置 firstViewController 的 managedObjectContext 属性之前不创建这两个实例就无法运行应用程序。最后,我的application: didFinishLaunchingWithOptions 代码实际上就是上面的sn-p 后跟return YES; 语句。

以上是关于如果我将 managedObjectContext 设置为使用属性,则为 null,但如果我将其设置为链式控制器,则为非 null的主要内容,如果未能解决你的问题,请参考以下文章

NSManagedObject 的 managedObjectContext 属性为 nil

尝试从 iOS 中的 Singleton 类初始化 ManagedObjectContext

如果我更改某些属性,是不是需要手动保存 NSFetchedResultsController 的 managedObjectContext?

Core Data iPhone 在插入 50k 记录时,我应该多久调用一次 [managedObjectContext save:&error]?

多个 ManagedObjectContext

如果它是子视图控制器,如何将 AppDelegate 中的 managedObjectContext 传递给正确的视图控制器?