2010-08-13 67 views
7

在我的iOS应用程序的界面我有明确的撤消&重做按钮(摇到撤消是一个相当重量级的行动,在这方面,索马里发展事务处是相当频繁地执行)。通常情况下,我会用志愿观察NSUndoManager的canUndo和canRedo关键路径,使&禁用按钮的通知进来不幸的是,NSUndoManager似乎并没有被KVO兼容那些关键路径 - 或者至少,我没有看到任何通知方面的信息。NSUndoManager和启用/禁用撤消按钮

所以我的问题是:我如何得到这个工作?我只是用KVO做错了吗? (我已经双重&三重检查,但总是有这种可能性)。有没有另一种方法可以做到这一点,我没有想到? (尽管我只是在每次runloop旋转的时候检查-canUndo的值,但对我来说有一种不好的代码味道)。

(请注意,它很可能是NSUndoManager是在iOS和Mac OS X不同,所以我不认为“它的工作原理在Mac上”将是一个有用的答案,在这种情况下)

回答

12
新的撤销组被创建时

注册您的NSUndoManager的NSUndoManagerDidUndoChangeNotification和朋友来检查和出栈,并适当地更新按钮状态。

+3

真棒 - NSUndoManagerWillCloseUndoGroupNotification是一个我以前错过了。一切都很有意义。谢谢@aclark。 – 2010-08-14 00:59:45

+1

最后一个跟进:这一切都很完美。 – 2010-08-14 02:15:21

+0

文档说:“发布一个'NSUndoManager'对象关闭撤消基团,其发生在'endUndoGrouping'方法实施之前。”。但是,我可以确认它在注册单个撤消时发布(例如,使用'-registerUndoWithTarget:selector:object:')。在'notification.object'('NSUndoManager')上调用'canUndo'非常有用,并且启用/禁用UI中的任何“撤消”按钮。 – 2015-11-26 09:14:33