喜:)我有一个类似的发行像Working with the same NSManagedObjectContext in multiple tabs
背景:
我managedObjectContext(进一步MOC)被初始化在我的appDelegate类和
myViewController.managedObjectContext = self.managedObjectContext;
或通过throught到多个标签在初始方法self.managedObjectContext = pContext;
的流程是:第一个视图是一个简单的集合列表。这些集合是通过NSFetchedResultsController(myViewController : UITableViewController<NSFetchedResultsControllerDelegate>
)获取的。通过选择一个,你可以更深入地浏览,但仍然通过这个MOC。
在下一个控制器(detailsViewController)中列出了我可以与之交互的一些项目(例如设置开关)。
我也有一个editingObjectContext:
的NSManagedObjectContext不会刷新正确
// DetailsViewController.m
NSManagedObjectContext* editingContext = [[NSManagedObjectContext alloc] init];
[editingContext setPersistentStoreCoordinator:[managedObjectContext persistentStoreCoordinator]];
self.editingObjectContext = editingContext;
现在我的问题:因为我的观点有旋转,我现在用的是如下因素绝招:
// DetailsViewController.m
DetailsView *localAct = [[DetailsView alloc] initWithManagedObjectContext:managedObjectContext ... ]
DetailsView *localSen = [[DetailsView alloc] initWithManagedObjectContext:managedObjectContext ... ]
UITableView *localContainerView = [[UITableView alloc] init];
self.containerView = localContainerView;
[localContainerView release];
//[...]
[containerView addSubview:actuatorView];
self.tableView = containerView;
进一步我有一个按钮来管理这个项目(哪些应显示,哪些不显示)。这个按钮只是重新载入一个新的fetchResult表。
// DetailsView.m
- (void) manageItems{
managing = !managing;
[viewController setIsManaging:managing]; // parent
self.fetchedResultsController = nil;
NSError *error = nil;
[[self fetchedResultsController] performFetch:&error];
[self reloadData];
[self updateBarButton];
}
用于放置物品进入情境的方法看起来如此:
// DetailsViewController.m
(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// init + create predicate
NSSet* set = [sen filteredSetUsingPredicate:predicate];
if([set count] > 0)
{
for(Act* act in set)
{
[editingObjectContext deleteObject:act];
}
}
else
{
Act* act = [NSEntityDescription insertNewObjectForEntityForName:@"Act" inManagedObjectContext:editingObjectContext];
// do things
}
NSError *error = nil;
[[detailView fetchedResultsController] performFetch:&error];
[self.containerView reloadData];
[detailView reloadData];
}
,但我选择的项目后的管理视图并点击保存(manageItems),视图不显示他们:/我必须切换选项卡或在其他控制器(父级或更深级)中导航以实现它。 我viewWillAppear中方法:
// DetailsViewController.m
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
DetailsView *detailView = se ? senView : actView;
// [do uninteresting stuff]
[detailView.fetchedResultsController performFetch:nil];
[self.tableView reloadData];
// [do uninteresting stuff]
}
和viewWillDisapper调用
- (void)saveChanges
{
if(![editingObjectContext hasChanges])
return;
// send save-command to server
}
在earliert Verison那里是只有1查看它的工作和我没有改变真的多...:/所以我不不明白为何MOC的行为就像它一样。 “manageItems”部分几乎相等,它在新版本(在DetailsView中而不是控制器中)只有更深的级别...
如果有人能告诉我我可以尝试什么(切换时总是保存到服务器在管理和正常之间不是一个解决方案,因为从服务器的响应延迟刷新高,所以我有更少的翻转视图。同时刷新self.tableView/detailView/self.containerView刷新视图带来相同的结果:/)。
第二个问题:发送到服务器后,我无法调用“editingObjectContext save:”方法,因为它抛出错误,根本不保存到本地数据库。
错误handleChangeResponse: “该操作不能完成(可可错误133020.)” 错误域= NSCocoaErrorDomain代码= 133020的UserInfo = 0x4d8bb90 {conflictList =( “NSMergeConflict(0x5a2fac0)为NSManagedObject( 0x5a46a80),其中oldVersion = 7和newVersion = 8,旧对象快照= {\ n iconName = noicon; \ n [...]; \ n}和新缓存行= {\ n iconName = noicon; \ n [...] \ n}” )}
如果您有疑问或需要更多的代码(即旧版本),然后就问;)
感谢在期待:)
好吧,我发现一个版本,与flipview工作...已经复制到新的代码,但仍然是同样的问题...:/ - ' - (void)manageItems/* DetailsViewController */ { \t DetailsView * detailView = isSen? senView:actView; \t [detailView manageItems]; }' --- ' - (void)manageItems // DetailsView { \t managing =!managing; \t [viewController setIsManaging:managing];/*父*/ \t self.fetchedResultsController = nil; \t NSError * error = nil; \t [[self fetchedResultsController] performFetch:&error]; \t [viewController.containerView reloadData]; \t [self updateBarButton]; }' – geo