2010-11-04 51 views
1

也許我是以這種錯誤的方式來的,但在我的應用程序中,我有可加載的包,它將NSMenuItem條目添加到主菜單。applicationDidFinishLaunching:在從NIB加載NSDocument後執行

我遍歷所有包並確定要添加的菜單項,然後相應地添加它們。

現在的問題是,這些代碼應該放在基於文檔的應用程序中去哪裏?

起初,我把它放在我NSDocument子類-windowControllerDidLoadNib:方法,但是這有重複相同的項目n時代不需要的副作用,其中n是我打開的文檔數(即它不是一個運行一個放置代碼的地方)。

於是我試圖把代碼在我NSApplicationDelegate-applicationDidFinishLaunching:方法,它確實意味着它只能運行一次,但在文檔跳起並顯示-applicationDidFinishLaunching:執行我現在面臨一個問題(或者至少在它結束之前)。

哪裏有放置代碼的權利,可以在啓動時動態地將菜單項添加到基於文檔的應用程序?

回答

1

爲每個創建/打開的文檔調用-windowControllerDidLoadNib:方法。這是更多的應用程序級別,因此文檔不應該擔心這一點。

如何使用-menuNeedsUpdate:委託方法在顯示時更新菜單?這樣,您的應用程序可以簡單地維護它在啓動時創建的列表並保持菜單更新。或者,你可以把它放在你的應用代理的方法-awakeFromNib中。

+0

-menuNeedsUpdate:看起來很有幫助,謝謝。但是,這是如何在多文檔應用程序(例如我的)中發揮作用的,每個文檔都要對菜單進行更改?似乎相當有限,它是一個委託,而不是一個通知,因此多個對象可以響應。當用戶在文檔之間切換時,我需要調整各種菜單項的狀態。 – d11wtq 2010-11-04 15:09:56

+0

劃痕。看起來像是發送了「NSMenuDidBeginTrackingNotification」。我的不好:) – d11wtq 2010-11-04 15:11:43

+0

所以你的文檔*確實對插件菜單的狀態有一個發言權?我想你需要更詳細地闡明你的問題。 – 2010-11-04 15:20:20