2012-06-04 72 views

回答

8

首先,你不應該自己調用awakeFromNib和windowDidLoad。你可以在你的自定義類中實現它們,然後Cocoa會在適當的時候調用它們。

awakeFromNib適用於從筆尖檔案加載的所有對象,而不僅僅是窗口和窗口控制器。這是一個很好的通用的地方做安裝 - 它是安全的(你保證對象完全加載,從初始化的調用返回,並設置了所有的插座),但仍然很早。

windowDidLoad(和windowWillLoad)適用於所有窗口,無論從nib存檔加載還是實時創建。但它不在窗口上調用,它在窗口的控制器上調用。 (通常你不會創建你自己的NSWindow子類,但是你創建了你自己的NSWindowController子類。)如果你已經設置了依賴於被加載的窗口的代碼,你應該把它放在這裏(但它實際上並不那麼重要的情況下,因爲一旦你嘗試訪問窗口屬性,它將被創建)。

initWithWindow:是你自己調用的東西,但一開始Cocoa程序員可能不想這樣做。

您應該閱讀一些Xcode附帶的指南。如果您想要基於文檔的應用程序,請從「基於文檔的應用程序編程指南for Mac」開始。如果你想要一個單窗口實用程序的應用程序,你仍然需要了解MVC等等,所以你可能首先需要構建一個基於文檔的應用程序來學習你的方法。另外,如果你想了解事件的順序,重寫每一條消息,然後添加類似NSLog(@「%s」,__FUNCTION__)的東西。和你的系統日誌將揭示一切。

+0

我在我的工具欄中有一個標籤項,我想根據上一個窗口(從服務器獲取有關用戶狀態的一些值)打開窗口後設置值。我首先將[setStingValue] - 方法放在initWithWindow中,然後放在windowDidLoad中(該類是NSWindowController的子類) - 它不起作用,最後我把它放在awakeFromNib中,然後它就起作用了 - 請你解釋一下爲什麼會發生這種情況? –

+0

正如我所說,如果你想知道發生了什麼,覆蓋你可以想到的每個消息(理想情況下在你的應用程序委託,窗口,視圖等,而不僅僅是你的窗口控制器),並添加一個NSLog消息,然後你會看到事件的順序,然後它應該對你更有意義。 – abarnert

1

在NIB取消存檔期間initWithWindow在您的窗口從NIB取消存檔後立即被調用。這是您的窗口控制器被初始化的地方。一旦完整的取消歸檔過程完成 - 意味着您的窗口控制器和UIView元素已準備好 - 調用awakeFromNib。在此之前,您沒有windowController或整個歸檔過程未完成。

當你做[label setStingValue]awakeFromNib你的窗口控制器已準備好,而且你的視圖對象和關聯的上下文已準備就緒。