2014-01-15 61 views
1

我一直在爲我的可可應用程序(OS 10.9)提供撤消功能,並且我已經成功實現了使用NSUndoManager的撤消功能實例。但是,我無法在編輯菜單下取消「撤消」文本!我正在使用setActionName方法,詳見Apple的文檔。我的相關方法:NSUndoManager setActionName:不更改菜單文本

- (void)FinishEditingName { 

[[self UndoManager] registerUndoWithTarget:[self TestObject] selector:@selector(setName:) object:[NSString stringWithFormat:@"Testing Undo!"]]; 
[[self UndoManager] setActionName:@"Edit Name"]; 

[[self TestObject] setName:[NSString stringWithFormat:@"New Name"]]; 

NSLog([NSString stringWithFormat:@"%@",[[self UndoManager] undoActionName]]); 

} 

同樣,撤銷完美的作品,即[[self TestObject] Name]設置「新名稱」上調用此方法,選擇編輯 - >撤消將此改爲「測試撤消!」。但是,「編輯」菜單的第一個條目應該更改爲「撤消編輯名稱」文本,但不是,它只是保留爲「撤消」。正如你所看到的,我已經確認文本應該通過吐出NSLog(),它工作得很好(即它提供「編輯名稱」)更改。我在這裏錯過了什麼?我是否需要以某種方式將NSUndoManager鏈接到NSMenu?如果是這樣,這是從文檔中丟失!

在此先感謝!

+0

此代碼在什麼對象?這個方法從哪裏調用? –

+0

在這種情況下,'self'是NSWindowController的自定義子類。該方法通過編輯窗口中的NSTextField來調用。 –

+0

WindowController的undoManager如何設置? –

回答

0

問題是我沒有使用NSDocument,在這種情況下菜單和NSUndoManager之間的鏈接沒有自動設置 - 你需要自己處理它。這似乎在NSDocument文檔中,但不在NSUndoManager文檔中,IMO應該指出。感謝您的幫助!

1

好吧,我沒有真正確定問題是什麼在這裏,但有兩個相關事物,你應該知道NSUndoManager:

⑴可以有一個單一的應用程序多undoManagers,實際上通常有是。例如,當用戶在textField中編輯文本時,textField通常使用自己的個人撤銷管理器來撤消輸入和編輯,而不是文檔的撤消管理器。這是因爲,在用戶接受她的輸入後,文檔撤消堆棧中不會有大量的虛假撤銷操作。 (例如:「撤消單一字母」,「撤消輸入另一個字母」,「撤消輸入第三個字母」),取而代之的只是一個不錯的「撤消對該文本字段的更改」。

因此,如果您要設置名稱例如textField的undoManager中的最後一個事件,它不會出現在文檔的撤消管理器中 - 它們沒有以任何方式鏈接。 ⑵Undos可以嵌套在撤消管理器中的子組中,如果在嵌套組中設置名稱,名稱不會在事件結束時自動冒泡到頂層(但是我對此並不積極)。我沒有看到任何嵌套,但值得一提。在每個事件開始時都有一個隱式撤銷組,並在最後關閉,因此如果您創建了另一個組,那麼這就是一個嵌套。

+0

感謝您的詳細回覆。對於我的情況,只有一個UndoManager應該工作,因爲我只會記錄重大更改而不是「每個字母」。你是正確的,我沒有使用嵌套的子組。我還應該提到我沒有使用NSDocument風格的應用程序 - 這是否重要? –