Iphone 为什么NSUndoManager可以撤消是?

Iphone 为什么NSUndoManager可以撤消是?,iphone,nsundomanager,Iphone,Nsundomanager,我在iPhone应用程序中创建了一个托管对象,其中包含几个NSNumber成员。我初始化这些值。我还创建了一个子对象成员。然后,我创建了一个撤销管理器,这样我就可以在子对象上执行撤销操作,而不会影响初始化的参数。然而,当我启动我的应用程序并呼叫 [undoManager canUndo]; 。。。是的。这怎么可能?顶级数据成员将重置为零。不仅如此,子对象的managedObjectContext也是零。在创建撤消管理器之前创建子对象时,这种情况如何发生。撤消管理器是否处于活动状态?它似乎允许撤

我在iPhone应用程序中创建了一个托管对象,其中包含几个NSNumber成员。我初始化这些值。我还创建了一个子对象成员。然后,我创建了一个撤销管理器,这样我就可以在子对象上执行撤销操作,而不会影响初始化的参数。然而,当我启动我的应用程序并呼叫

[undoManager canUndo];
。。。是的。这怎么可能?顶级数据成员将重置为零。不仅如此,子对象的managedObjectContext也是零。在创建撤消管理器之前创建子对象时,这种情况如何发生。撤消管理器是否处于活动状态?它似乎允许撤消整个托管对象,即使这些数据成员是在我创建撤消管理器之前设置的


任何洞察都值得赞赏。

如果未保存托管对象,则NSEndomanager的创建将应用于该对象,并允许撤消对该对象的任何更改。我通过在视图出现之前保存对象发现了这一点,因为对象是从各种屏幕上的选项创建的。如果我在保存对象后尝试撤消,canUndo会像预期的那样返回NO

另一个选项是在视图出现后调用undo manager上的removeAllActions,但这会有问题,因为入口点太多。现在该对象已保存,如果用户取消,我将删除它


我希望这对将来的人有所帮助。

在撤消管理器中注册更改将被推迟。在设置撤消管理器之前,必须确保已处理更改。您可以使用processPendingChanges方法。这里有一个小例子:

// create initial objects
[managedObjectContext processPendingChanges];

// enable undo
managedObjectContext.undoManager = undoManager;

NSManagedObjectContext创建自己的撤消管理器。使用disableUndoRegistration和enableUndoRegistration可防止某些事情被撤消。@ughoavgfhw:在iOS平台上不正确!我遵循了iPhone的CoreDataBooks示例。令人费解的是,canUndo在创建undo管理器后返回NO,并且在ViewWillAspect方法中也返回NO(我注释掉了影响该对象的任何其他代码)。但当我点击“撤消”按钮时,它返回“是”。这是怎么回事?你可能想要接受你之前问题的最佳答案-使用每个答案左边的复选标记。