Nim*_*rod 3 iphone cocoa-touch core-data iphonecoredatarecipes
我知道如何解决这个问题,但是我不理解为什么这不起作用.我有一个使用Core Data的UIViewController子类,因此它需要NSManagedObjectContext.控制器从nib文件加载,它位于选项卡控制器内的导航控制器下.
我尝试在initWithCoder和viewDidLoad中执行此操作,由于某种原因它不起作用:
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
self.managedObjectContext = [[appDelegate managedObjectContext] retain];
Run Code Online (Sandbox Code Playgroud)
出于某种原因,managedObjectContext返回nil,当我稍后尝试创建托管对象时,我得到了这个:
***由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'+ entityForName:无法在此模型中找到名为'LogRecord'的实体.
当您的上下文为零或无法加载模型(或实际上缺少实体)时,您获得的是什么.
如果我在saveLogEntry方法(创建托管对象并保存上下文)的顶部执行完全相同的操作,那么它可以正常工作.
如果我执行Recipes示例应用程序所做的事情:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
loggingViewController.managedObjectContext = self.managedObjectContext;
// Standard stuff
[window addSubview:tabBarController.view];
[window makeKeyAndVisible];
}
Run Code Online (Sandbox Code Playgroud)
(loggingViewController是app delegate中的IBOutlet).
有谁知道这里可能会发生什么?如果"太早"完成它似乎失败,但特别是使用viewDidLoad我希望它能够工作,因为我认为这是在调用addSubview之后发生的.
完成食谱应用程序的功能.
如果您在initWithCoder中尝试它,您不知道应用程序委托是否已完成初始化(它没有)
如果你试试viewDidLoad,你有类似的问题.
这就是为什么你要不要来访问,像这样的应用程序的委托:
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
self.managedObjectContext = [[appDelegate managedObjectContext] retain];
Run Code Online (Sandbox Code Playgroud)
这是不好的形式.它将耦合引入您的设计中.使用依赖注入,就像示例一样.它使您的应用程序更灵活.
因为来自app委托,您确切知道已执行的初始化,并且可以在适当的时间传递上下文.
更新:
问题是您的View Controller实例可能正在Mainwindow.xib中实例化.Mainwindow.xib(以及它引用的任何其他nib)在app委托收到UIApplicationDidFinishLaunchingNotification通知之前被"解冻".
不保证对象从笔尖解冻的顺序.当您在View Controller上调用initWithCoder:时,您不知道其他对象是否已从nib解冻.您还无法确定应用程序委托是否已收到UIApplicationDidFinishLaunchingNotification通知.
它与viewDidLoad类似.在viewDidLoad中,您可以确保nib中的所有其他对象都已正确解冻和初始化,但由于应用委托的配置发生在nib文件之外,因此您无法确定是否可以安全地调用该应用程序代表.
最好只是让app delegate在"good and ready"时在上下文中传递,最好是在applicationDidFinishLaunching:方法中.
希望更清楚一点,你应该看一下iphone编程指南:http: //developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/index.html
收集iPhone应用程序生命周期的更好解释.
希望有所帮助.
还有一个更新:
深入讨论iphone发布序列:http://www.bit-101.com/blog/? p = 2159