解析度
NSUndoManager
只能在孩子中NSManagedObjectContext
使用(与 Core Data 一起使用时)。这是因为它UIManagedDocument
可能会在任何时间点自动保存,之后undo
将不起作用。因此,仅仅实现保存/取消功能是没有意义NSUndoManager
的,因为子上下文会给你相同的结果。
真的有点难过,因为NSUndoManager
它比子上下文更容易实现(对于后者,我必须调用existingObjectWithID
将对象从父级复制到子级 - 很痛苦)。我个人认为如果groupingLevel != 0
. 吐槽完了。
原始问题
我有一个表视图控制器,它使用 Core Data 将数据加载到UIManagedDocument
. 它使用视图控制器来编辑表格中的每一行。在那个视图控制器中,我有取消和保存按钮。我正在通过我的对象NSUndoManager
上的一个类别(如下)来实现取消功能。NSManaged
self.list
- (void)viewDidLoad
{
[super viewDidLoad];
[self.list beginEdit];
}
- (IBAction)cancel:(id)sender
{
[self.list cancelEdit];
[self close];
}
- (IBAction)save:(id)sender
{
[self.list endEdit];
[self close];
}
类别 implements beginEdit
,旨在处理 NSUndoManager 的东西endEdit
。cancelEdit
在下面的代码中,useUndo
我将其设置为 NO 或 YES 以查看使用 NSUndoManager 的影响。
- (void)beginEdit
{
if (useUndo)
{
NSUndoManager *undoManager = [[NSUndoManager alloc] init];
self.managedObjectContext.undoManager = undoManager;
[undoManager beginUndoGrouping];
}
}
- (void)endEdit
{
[self.managedObjectContext save:nil];
if (useUndo)
{
NSUndoManager *undoManager = self.managedObjectContext.undoManager;
[undoManager endUndoGrouping];
self.managedObjectContext.undoManager = nil;
}
}
- (void)cancelEdit
{
if (useUndo)
{
NSUndoManager *undoManager = self.managedObjectContext.undoManager;
[undoManager endUndoGrouping];
[undoManager undo];
}
}
如果我保存一个对象并在useUndo = NO
. 但是,useUndo = YES
当我单击主页按钮时,它不会自动保存。我已经等了几分钟,它仍然没有自动保存。有什么办法可以强制自动保存吗?
谁能解释为什么使用 undoManager 会导致这种行为变化?
我怀疑我的处理方式错误,或者代码中有一些简单的问题。任何帮助,将不胜感激。