在视图控制器(选项卡1)中,我从核心数据加载:
- (void)loadRecordsFromCoreData {
[self.managedObjectContext performBlockAndWait:^{
NSError *error = nil;
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Item"];
[request setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"order" ascending:YES]]];
self.items = [self.managedObjectContext executeFetchRequest:request error:&error];
}];
}
然后我显示这样的项目(在viewDidAppear中):
- (void)displayItems
{
for(UIView *subview in [self.itemRow subviews]) {
[subview removeFromSuperview];
}
int xPos = kXItemOffsetIphone;
for (Item *item in self.items) {
ItemView *itemView = [[ItemView alloc] initWithFrame:CGRectMake(xPos, kYItemOffsetIphone, kItemWidthIphone, kItemHeightIphone) ];
[itemView layoutWithData:item];
[self.itemRow addSubview:itemView];
xPos += kXItemSpacingIphone;
}
}
ItemView是一个UIView子类,它显示与项目相关的图像等。 当我第一次运行应用程序时,会显示所有项目。但是,如果我点击另一个标签,然后返回标签1,我的所有项目都会消失。项目数组仍然存在,但数组中的每个项目都是“错误”,因此不会显示任何内容。很沮丧。如何防止这些物品成为“缺陷”?
答案 0 :(得分:4)
听起来你的NSManagedObjectContext
正在被取消分配(当你切换标签时,你的视图控制器可能正在卸载/自行清理?)。
在幕后,您的对象只是移入和移出SQLite存储的数据以及NSManagedObjectContext
管理的缓存之间的代理。取消分配上下文时,代理对象仍然存在(因此您的数组仍然填充了对象),但是他们无法向已释放的托管对象上下文请求数据,并且所有值都会恢复为错误。
您有几个选择:
当您在控制器之间移动时,您可以传递对NSManagedObjectContext
的引用,这样您就不会丢失它。
您可以在-viewWillAppear:
或其他方法中重新获取数据,您会发现每次显示视图时都会触发该方法。
您还可以将NSManagedObjectContext
移动到应用程序生命周期中存在的单个对象,但如果您不小心,这可能会变得脆弱。