我在类似的线程上看到了很多回复,但在遵循他们的建议之后,我仍然有一个奇怪的问题,并且正在敲打我的头。
我有一个人员表,可以让用户通过填写表单为其他用户添加条目。该构造函数如下所示:
-(id)initWithContext:(NSManagedObjectContext *)context {
self = [super initWithNibName:@"FamilyMemberInfoViewController" bundle:[NSBundle mainBundle]];
if (self) {
self.managedObjectContext = context;
mainUser = [NSEntityDescription insertNewObjectForEntityForName:@"FamilyMember" inManagedObjectContext:context];
Details *userDetails = [NSEntityDescription insertNewObjectForEntityForName:@"Details" inManagedObjectContext:context];
mainUser.details = userDetails;
userDetails.familyMember = mainUser;
...等
然后如果用户点击后退按钮,我会调用:
-(void) viewWillDisappear:(BOOL)animated {
if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) {
...
[self.managedObjectContext rollback];
[mainUser release];
self.managedObjectContext = nil;
...
当它转到父表视图控制器时,它会使用下面的代码重新加载数据,并且正如预期的那样,对象消失了。
-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
if (viewController == self) {
NSFetchRequest *familyMemberRequest = [NSFetchRequest new];
NSEntityDescription *familyDescription = [NSEntityDescription entityForName:@"FamilyMember" inManagedObjectContext:self.managedObjectContext];
familyMemberRequest.entity = familyDescription;
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"isMainUser == 0"];
[familyMemberRequest setPredicate:predicate];
NSError *error;
self.familyMembers = [managedObjectContext executeFetchRequest:familyMemberRequest error:&error];
NSLog(@"Retrieved family members! Count = %i", self.familyMembers.count);
[familyMemberRequest release];
}
}
但是 - 当我点击带有tableView
的选项卡并返回它时,它再次运行相同的代码并在托管对象上下文中找到被取消的对象。
但是 - 当我重新运行应用程序时,它无处可寻。
如果我尝试创建另一个新人并退出,它最初会显示正确的条目数(没有任何已取消的对象),然后当我单击另一个选项卡然后再显示它时,只显示最近取消的对象除了应该存在的那些。
我已尝试在FamilyMemberInfoViewController
中清除托管对象上下文的各种方式:[context reset]
,[context rollback]
,[context deleteObject:]
,[context processPendingChanges]
等等。尝试实验性地加载familyMembers
数组两次,即使我单击后退按钮它仍然找到正确数量的对象,但当我单击一个不同的选项卡然后返回它显示额外的对象(然后继续出现,如果我去那里然后回来。)
有什么想法吗?