我有一个核心数据基于文档的应用程序,它支持撤消/经由内置NSUndoManager与相关联的NSManagedObjectContext重做。我有核心数据内执行大量任务设置了几个动作,包住所有这些任务分成经由beginUndoGrouping / endUndoGrouping撤消组,并且由NSUndoManager进行处理。

撤消工作正常。我可以执行几个连续的动作,而且每个然后撤消他们中的每一个先后与我的应用程序的状态保持正确。然而,“重做”菜单项从未启用。这意味着不存在任何项重做NSUndoManager说的是菜单。

我很奇怪,为什么NSUndoManager貌似是忘记了项目一旦被撤销,而不是允许进行重做操作?

一件事我应该提到的是,我禁用一个文件被打开/创建后撤消登记。当我执行一个动作,我叫enableUndoRegistrationbeginUndoGrouping,执行的操作,然后调用processPendingChangessetActionName:endUndoGrouping,最后disableUndoRegistration。这可以确保只有特定的动作是可撤销的,和任何其他数据的变化我做的这些外部被忽视的NSUndoManager。这可能是问题的一部分,但如果是这样,我不知道为什么它的影响重做?

预先感谢。

有帮助吗?

解决方案 2

我已经修复了这个问题:

保持撤消注册时启用所有的时间,除了时候,我明确不想记录索马里发展事务处。

我已经了解到:

如果您只启用执行要记录更改之前撤销登记,并提交这些更改后立即禁用,则NSUndoManager的重做堆栈永远不会被填充。

因此,永远不会调用disableUndoRegistration

其他提示

其实,只要你俩-undo和(后他们disableUndoRegistration)-redo之前调用enableUndoRegistration,你可以实现你所追求的。

我相信,你只在调用之前和改变你的管理对象后启用(/禁用)UndoRegistration。这意味着你的“撤消”没有与撤消管理器注册,因此你不能“重做”了。

我叫disableUndoManager同时保持“重做”已启用。为此,我子类NSUndoManager和包括在本方法:

-(void) undo
{
  [[appDelegate managedObjectContext] processPendingChanges];
  [self enableUndoRegistration];
  [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:[NSDate date]];
  [super undo];
  [[appDelegate managedObjectContext] processPendingChanges];
  [self disableUndoRegistration];
}

NSUndoManager,核心数据和选择性表示由Stefanf撤消/重做:“NSUndoManager等待下一运行循环周期直至它注册更改”

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top