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

时间:2014-01-25 10:50:40

标签: ios objective-c xcode core-data nsmanagedobjectcontext

如果我使用以下代码将AppDelegate的managedObjectContext设置为firstViewControllerUITableViewController只是AppDelegate.m application: didFinishLaunchingWithOptions rootTabBarController *rootabbarcontroller = (rootTabBarController *)self.window.rootViewController; UINavigationController *navigationController = [[rootabbarcontroller viewControllers] objectAtIndex:0]; FirstViewController *firstViewController = [[navigationController viewControllers] objectAtIndex:0]; firstViewController.managedObjectContext = self.managedObjectContext; 的子类方法,

managedObjectContext

然后运行模拟器,在FirstViewController.m的{​​{1}}方法中viewDidLoad的值设置为非空,因此核心数据按预期工作。

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


_firstViewController.managedObjectContext = self.managedObjectContext;

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

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

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

我已经阅读了一些博客来采用后一种方法(链接不方便,对不起),因此可以采用后一种方法正确设置其managedObjectContext值并使用UITableView合成核心数据。

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

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

[更新]

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

self.firstViewController = firstViewController;

然后我收到了编译错误,因为那里没有定义firstViewController

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

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

AppDelegate.m似乎正常工作,但这次viewDidLoad的{​​{1}}方法出错,与我第一次报告的方法相同。

1 个答案:

答案 0 :(得分:2)

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

添加:

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

之前:

_firstViewController.managedObjectContext = self.managedObjectContext;