2012-06-27 44 views
2

爲什麼[self undoManager]在基於文檔的應用程序的子窗口中爲零?撤消管理器爲零---爲什麼?

它不應該引用其父窗口的撤銷管理器嗎?在父窗口中,我得到了撤消管理器的實際地址!

+0

而'self'這裏是'NSDocument'的子類嗎? – trojanfoe

+0

'self'從'NSWindowController'分類;它是否僅在從「NSDocument」子類時才起作用? – markjs

回答

2

undoManager不是NSWindowController的成員。 這只是一個NSDocument「功能」。

摘自NSDocument文檔: ...文檔管理其窗口的編輯狀態,並設置爲執行撤消和重做操作。 ....

節「子類NSDocument」:

....子類也是負責創建用於管理文件窗口的窗口控制器和撤消的實施和重做。 ...

您編寫的代碼不適用於其他強類型語言,因爲您會將消息發送給不存在的對象。我很確定你應該在這裏有一個編譯器警告。

希望這有助於

最好,

弗洛

+0

謝謝,這確實有幫助。問題仍然是我如何解決它。我需要一種方法來確定我的子窗口屬於由** X **指向的文檔。如果通過'appController'打開窗口,我將如何獲得** X **? – markjs

+0

我重新實現了'showWindow:sender',拿起文檔指針(應該是「sender」),然後調用'[super showWindow]''。爲什麼它會得到這個錯誤:* 2012-06-27 14:39:59.315 myApp [32268:403] + [AppController _autosavesInPlace]:無法識別的選擇器發送到類0x105c70790 *? – markjs

+0

請忽略之前的評論:「發件人」是appController,而不是父文檔。那麼,我將如何獲得指向* NSDocument *的指針呢? – markjs

0

Flo的答案是一個很好的起點。一段時間後,事實證明,響應者鏈不知何故(或者,它可能是我:-))。

子窗口,通過NSWindowController控制,應自動(?)有文件屬性,以便[self document]返回與此窗口關聯的文檔。從中撤出撤消管理器很容易。

但是,在我的應用程序(也在一個小測試應用程序中),此文檔未設置。當我從文檔([newWindow setDocument:self])中手動設置它時,一切正常:註冊撤銷/重做動作,菜單欄等。

+0

現在你的問題得到解答了嗎? – guitarflow

+0

是的。但是,一個新的問題如下:*爲什麼*響應者鏈變得混亂了?我是否錯誤地認爲它應該返回到原始文檔?如果是這樣,爲什麼?如果不是,還有什麼事情發生? – markjs