我遇到以下错误:
2012-04-18 10:15:49.585 FoodXJournal[13931:fb03] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'CommodityTypes''
我已经阅读了这个主题的大部分其他问题,并做了一些检查。
我有一个包含静态表视图的详细视图控制器。表视图的一个单元格标记为“删除”,并链接到名为“deleteCT”的segue。我希望应用程序删除self.detailItem
并在点击此单元格时切换到主视图控制器。这是我的方法。所有NSLog行都用于调试它。
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"deleteCT"]) {
if (![self.detailItem.myCommodities count]) {
NSLog(@"Testing");
NSLog(@"myCommodities is empty:%@", [self.detailItem.myCommodities count]);
NSLog(@"self.detailItem HAS a context:%@", [self.detailItem managedObjectContext]);
NSLog(@"self.detailItem is of CommodityTypes:%@", [[self.detailItem entity] name]);
NSLog(@"self.detailItem has a managed object model:%@", [[self.detailItem entity] managedObjectModel]);
[[self.detailItem managedObjectContext] deleteObject:self.detailItem];
}
}
}
这是日志。我确实参与了这个方法,
2012-04-18 10:15:49.544 FoodXJournal[13931:fb03] Testing
我符合删除的条件,
2012-04-18 10:15:49.544 FoodXJournal[13931:fb03] myCommodities is empty:(null)
错误消息显示'+entityForName: could not locate an NSManagedObjectModel for entity name 'CommodityTypes'
,但self.detailItem
有上下文。
2012-04-18 10:15:49.545 FoodXJournal[13931:fb03] self.detailItem HAS a context:<NSManagedObjectContext: 0x6d7e740>
是的,self.detailItem
是我想到的实体类型:
2012-04-18 10:15:49.546 FoodXJournal[13931:fb03] self.detailItem is of CommodityTypes:CommodityTypes
而且,是的,该实体类型(NSLog(@"self.detailItem is of CommodityTypes:%@", [[self.detailItem entity] name]);
)具有托管对象模型:
托管对象模型描述很长,所以我只在这里展示它的第一部分:
2012-04-18 10:15:49.565 FoodXJournal[13931:fb03] self.detailItem has a managed object model:(<NSManagedObjectModel: 0x6d73250>) isEditable 0, entities {
Accounts = "(<NSEntityDescription: 0x6d71120>) name Accounts, managedObjectClassName Accounts, renamingIdentifier Accounts, isAbstract 0, superentity name Grandparent, properties {\n \"account_1\" = \"(<NSAttributeDescription: 0x6d6e9d0>), name account_1, isOptional 1, isTransient 0, entity Accounts,
向下滚动:
CommodityTypes = "(<NSEntityDescription: 0x6d71240>) name CommodityTypes, managedObjectClassName CommodityTypes, renamingIdentifier CommodityTypes, isAbstract 0, superentity name Grandparent, properties {\n myCommodities = \"(<NSRelationshipDescription: 0x6d701f0>), name myCommodities, isOptional 1, isTransient 0, entity CommodityTypes,
CommodityTypes
在托管对象模型中定义。
那么为什么[[self.detailItem managedObjectContext] deleteObject:self.detailItem];
会崩溃?!?
我有什么理由不能在prepareForSegue中删除self.detailItem
吗?我是否需要为单元格或标签指定一个动作,然后以编程方式调用segue?
答案 0 :(得分:3)
尤里卡!谢谢jrturton!它不是来自创建新托管对象的方法,但是您的想法确实让我回过头来使用该行之前和之后的一堆断点。我在主表视图中将其缩小到NSEntityDescription *entity = [NSEntityDescription entityForName:@"CommodityTypes" inManagedObjectContext:self.managedObjectContext];
。启动时,app委托设置托管对象上下文并将其传递给主视图。我忘了当我从详细视图到主视图的NEXT INSTANCE的时候,我不一定会回到原来的实例。我必须将托管对象上下文传递给下一个视图控制器。
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"deleteCT"]) {
if (![self.detailItem.myCommodities count]) {
CommodityTypes * thisItem = self.detailItem;
NSManagedObjectContext * thisContext = [thisItem managedObjectContext];
FoodXCommodityTypesMasterViewController * nextView = [segue destinationViewController];
[thisContext deleteObject:thisItem];
nextView.managedObjectContext = thisContext;
}
}
}
现在可以使用了。