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];
}
该类别实现beginEdit
,endEdit
和cancelEdit
,用于处理NSUndoManager内容。在下面的代码中,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];
}
}
我可以看到Core Data调试消息显示如果保存对象并在useUndo = NO
时单击主页按钮,则提交更改。但是,使用useUndo = YES
时,单击“主页”按钮时不会自动保存。我等了几分钟,它仍然没有自动保存。有什么方法可以强制自动保存吗?
有人可以解释为什么使用undoManager会导致行为发生这种变化吗?
我怀疑要么是以错误的方式解决这个问题,要么在代码中遇到一些简单的问题。任何帮助将不胜感激。
答案 0 :(得分:1)
我不确定它是否正确但是stackoverflow上的其他答案已经提到NSUndoManager在上下文保存时清除撤消堆栈。这意味着使用具有自动保存功能的撤消管理器最多只需几秒钟(无论自动保存间隔是多少)。那里可能有联系,我正在努力寻找更多......