有两个实体:作者和书。作者具有一个属性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现在具有“子”的更改,但是尚未将任何更改保存到磁盘。

10-07 12:46