2011-07-11 27 views
3

什麼時候創建keyWindow?何時創建NSApp的keyWindow?

我認爲NSWindow會在相應的視圖控制器的updateView方法被調用之前創建(我調用它來響應awakeFromNib),但是如果我使用NSApp的keyWindow創建一個警報表,它不會正確顯示。但是,如果我在該視圖上放置一個按鈕,然後在用戶單擊該按鈕時彈出警報,則會定義keyWindow,並且警報正確顯示(如預期的那樣)。

我的應用程序委託幾乎完全是空的。

我並不想在啓動時顯示警報,但我確實想知道關鍵窗口何時設置。 :)

回答

4

什麼時候創建keyWindow?

-[NSApp keyWindow]點到當前的關鍵窗口,典型地通過發送它-makeKeyAndOrderFront:現有的窗口(例如,已經被從nib文件加載的窗口)。

當應用程序啓動時,可可:

  1. 加載主筆尖文件;
  2. 解除存檔nib文件的內容並實例化其對象;
  3. 重建在nib文件中定義的連接;
  4. -awakeFromNib發送到nib文件對象的一個​​子集;
  5. 顯示已標記爲的窗口在啓動時可見;

Resource Programming Guide中所述。

如果筆尖文件包含一個窗口,該窗口變得如證明前提是它可以成爲一個重要窗口鍵,出現這種情況-awakeFromNib已發送

此外,the documentation for -[NSApplication keyWindow]指出:

這種方法可能會返回nil如果應用程序的筆尖文件還沒有完成加載但或者,如果接收機不活躍。

+0

如果nib文件包含很多窗口,但默認只顯示其中一個,該怎麼辦?其他控制器如何在不需要知道nib文件是否已完成加載的情況下查看主窗口或關鍵窗口? (我現在試圖在相應的窗口控制器上使用windowDidLoad事件,但它們沒有被觸發)。 – Arafangion

+0

評論中的後面的問題或多或少地通過http://stackoverflow.com/questions/2695671/nswindowcontroller-windowdidload-not-call回答,因此它接受你的答案,因爲它很好地回答了原始問題。 – Arafangion

+0

@Ara'NSApplication'和'NSWindow'發佈了一些可用於協調的通知。你可以聽這些通知,或者在'NSApplicationDelegate'和'NSWindowDelegate'中使用相應的方法。也許這就需要更多的關於你的架構和預期行爲的細節。 – 2011-07-11 08:35:41