我使用的是Xcode 4.2和iOS SDK 5.0以及Apple的Master Detail Application Template for iPad with Core Data。它类似于"位置"示例代码。我已经成功地将托管对象上下文(MOC)从MasterViewController(MVC)传递到DetailViewController(DVC)。局部视图控制器在一些文本框中接受来自用户的输入,并将其存储在核心数据中;这部分很有魅力。现在,我有一个ActionViewController(AVC),它是一个Popover视图,如果用户选择的话,它应该允许用户通过电子邮件发送MOC中的所有数据。然而,当尝试进行提取时,我会得到一个SIGABRT。我使用断点来精确定位:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//Fetch the crosses
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event"
inManagedObjectContext:context];
[fetchRequest setEntity:entity]; // Where it crashes
//Other code
}
此外,在调试器中,我看到*上下文指针是0x0,我猜这意味着它不存在?
我让MVC通过MOC的方式是这样的:
// Pass the managedObjectContext to the DetailViewController as a property
_detailViewController.managedObjectContext = self.managedObjectContext;
//Pass the MOC to the actionViewController
_actionViewController.managedObjectContext = self.managedObjectContext;
我看过其他帖子,似乎将MOC从AppDelegate传递给所有视图控制器可能是一种方法,但我想弄清楚为什么数据输入适用于DVC,但在AVC中获取数据时会崩溃。我犯了什么大错误?
github项目的固定链接:https://github.com/scottdaniel/fly_punnett
所以我想明白了,尽管我可能打破了一些"好编程"的准则。。。
我所做的只是删除
//Pass the MOC to the actionViewController
_actionViewController.managedObjectContext = self.managedObjectContext;
以及从AVC到MVC的所有其他连接(即MCV接口中的@class ActionViewController、@property*ActionViewController)<lt;如果你想要,请问我完整的细节,或者在github(上面的链接)上查看
然后我添加了
#import AppDelegate.h
到我的ActionViewController.m
并修改了MOC的创建,如下所示:
-(void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//Fetch the crosses
NSManagedObjectContext *context = [(AppDelegate *)[[UIApplication
sharedApplication] delegate]
managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Event"
inManagedObjectContext:context];
MOC创建成功,我可以为用户获取数据,并将其放入电子邮件中,他们可以发送给任何人。