如果我使用以下代码将AppDelegate的managedObjectContext
设置为firstViewController
,UITableViewController
只是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}}方法出错,与我第一次报告的方法相同。
答案 0 :(得分:2)
在为其设置托管对象上下文之前,您是否已将局部变量firstViewController
设置为ivar / property?
添加:
self.firstViewController = firstViewController;
// or
_firstViewController = firstViewController;
之前:
_firstViewController.managedObjectContext = self.managedObjectContext;