撤消子视图控制器的所有更改(undo all changes made in the child v

2019-06-24 03:56发布

有两个实体:作者和图书。 笔者有一个属性AUTHORNAME和一对多关系的书。 本书有几个属性和关系的作家。 有一种观点控制器(VCAuthor)来编辑一个Author对象。 子视图控制器(VCBook)是编辑作家的书籍。 只有一个managedobjectcontext。 在VCBook类别i组的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,我编辑AUTHORNAME在UITextfiled authorNameTextField从奥巴马到大奥巴马,并把它保存在商务部通过author.authorName = authorNameTextField.text - (空)viewWillDisappear:(BOOL)动画{} 方法。 然后我就去到子视图控制器VCBook并编辑作者的书,然后点击取消按钮返回到VCAuthor。 我觉得AUTHORNAME还是奥巴马,这意味着AUTHORNAME的预期变化已经撤销。 该AUTHORNAME的变化不是撤消组中的所有的,为什么会这样呢? PS。 当然,我reloadData当我得到回VCAuthor。 我的NSLog的AUTHORNAME之前和撤消后。 之前撤消AUTHORNAME是被改变的一个大的奥巴马,并撤消后成为奥巴马

Answer 1:

几件事情要考虑。 首先,在这样的情况下,我会用一个单独的MOC,而不是撤消管理。 也就是说,我会做这样的事情(假设ARC - 如果有必要,你可以做的映射)...

你必须有一些其他的代码通过一个setter提供书的VC,因为你在viewDidLoad中访问它。 我会改变的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行动。 如果你不调用保存,没有任何的变化将被保存,他们都将只是自动消失。

编辑

注意,上面的“保存”只是移动对象的状态到父上下文。 因此,“主”商务部现在已经从“子”的变化,但没有任何的更改已保存到磁盘呢。



文章来源: undo all changes made in the child view controller