有两个实体:作者和书。作者具有一个属性authorName和一对多的关系书。本书具有几个属性和一个关系作者。有一个用于编辑Author对象的 View Controller (VCAuthor)。 subview Controller (VCBook)用于编辑作者的书籍。只有一个托管对象上下文。在VCBook类中,我将undomanager分组如下
-(void)viewDidLoad
{
NSUndoManager *anUndoManager = [[NSUndoManager alloc] init];
[self.book.managedObjectContext setUndoManager:anUndoManager];
[anUndoManager release];
[self.book.managedObjectContext.undoManager beginUndoGrouping];
}
-(void)cancelAction:(id)sender
{
NSLog(@"%@", self.author.authorName);
[self.book.managedObjectContext.undoManager endUndoGrouping];
[self.book.managedObjectContext.undoManager undoNestedGroup];
self.book.managedObjectContext.undoManager = nil;
NSLog(@"%@", self.author.authorName);
[self dismissModalViewControllerAnimated:YES];
}
cancelAction链接到VCBook上的“取消”按钮,该按钮用于撤消VCBook中所做的所有更改。
问题出在这里:首先,在VCAuthor中,我将UIName字段中的authorName编辑为从Obama到Big Obama的authorNameTextField,然后通过author.authorName = authorNameTextField.text将其保存在MOC中-(void)viewWillDisappear:(BOOL)动画。 {} 方法。然后,我进入了 subview Controller VCBook来编辑作者的书,然后单击“取消”按钮返回到VCAuthor。我发现authorName仍然是Obama,这意味着authorName的预期更改已撤消。 authorName的更改根本不在撤消组中,为什么会发生这种情况? ps。当然,当我回到VCAuthor时,我会重新加载数据。
在撤消之前和之后,我只是NSLog authorName。撤消之前authorname是已更改的一位大奥巴马,撤消之后它成为了奥巴马
最佳答案
需要考虑的几件事。首先,在这种情况下,我将使用单独的MOC代替撤消管理器。也就是说,我会做类似的事情(假设是ARC-如果需要,您可以进行映射)...
由于必须在viewDidLoad中进行访问,因此您还必须具有一些通过 setter 将书籍提供给VC的其他代码。我将viewDidLoad更改为这样的内容...
-(void)viewDidLoad
{
self.managedObjectContext = [[NSManagedObjectContext alloc] init];
self.managedObjectContext.parentContext = self.book.managedObjectContext;
// We are in the main thread, so we can safely access the main MOC
// Basically, move our object pointer to book into our local MOC.
NSError * error = nil;
Book *book = [self.managedObjectContext existingObjectWithID:self.book.objectID error:&error];
// handle nil return and/or error
self.book = book;
// Now, your access to book will be in the local MOC, and any changes
// you make to the book or book.author will all be confined to the local MOC.
}
现在,您要做的就是打电话
[self.managedObjectContext save:&error];
在saveAndDismiss Action 中。如果您不调用保存,则所有更改都不会保存,它们只会自动消失。
编辑
注意,上面的“保存”只是将对象状态移动到父上下文中。因此,“主” MOC现在具有“子”的更改,但是尚未将任何更改保存到磁盘。