2010-08-13 112 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