如果我将 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.m
的 application: 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.m
的viewDidLoad
方法中managedObjectContext
的值设置为非空,因此Core Data 可以正常工作。
但是,当我尝试在application: didFinishLaunchingWithOptions:
方法中编写以下代码时:
_firstViewController.managedObjectContext = self.managedObjectContext;
并运行模拟器,FirstViewController.m
的viewDidLoad
方法中的结果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.m
的viewDidLoad
方法出现错误,和我第一次报告的一样。
【问题讨论】:
您是否尝试过使用NSLog
来查看rootTabBarController
、navigationController
和firstViewController
的值在-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]?
如果它是子视图控制器,如何将 AppDelegate 中的 managedObjectContext 传递给正确的视图控制器?