2010-04-23 67 views
9

我有一個簡單的Cocoa應用程序使用NSWindowController子類。在筆尖我已設置:NSWindowController windowDidLoad不叫

  • 文件所有者的課我NSWindowController子類
  • 文件的所有者的「窗口」出口到筆尖的主要NSWindow。

我的NSWindowController子類的init方法被調用(我叫超級),但不管我做什麼windowDidLoad永遠不會被調用。

我必須錯過一些明顯的東西,但對於我的生活,我無法弄清楚它是什麼。

+0

你是如何初始化類的?你是否調用super的'-initWithWindowNibName:'實現? – 2010-04-23 02:09:37

+0

我的NSWindowController子類在nib中實例化,就像這個doc討論的那樣:http://developer.apple.com/mac/library/documentation/cocoa/conceptual/ObjCTutorial/06Controller/06Controller.html#//apple_ref/doc/ uid/TP40000863-CH8-SW1 基本上,MainMenu.xib創建它 – 2010-04-23 02:14:47

+0

我面臨類似的問題:我沒有調用' - (void)windowDidLoad'。經過一番挖掘,我發現我的錯誤在我的NSWindowController子類中聲明'window'屬性。我刪除了該成員並調用了'showWindow:'方法來成功獲得窗口。 – Raviprakash 2011-04-13 06:48:12

回答

22

您正試圖通過在另一個nib中實例化它來創建NSWindowController的實例。但是,當您在nib文件中實例化對象時,它將通過調用-initWithCoder:進行初始化。

-initWithCoder:不是NSWindowController的指定初始值設定項,所以您的NSWindowController實例永遠不會加載它的筆尖。

而是通過將其放置在MainMenu.xib文件在Interface Builder中實例化的NSWindowController實例,編程創建:

AppDelegate.h

@class YourWindowController; 
@interface AppDelegate : NSObject 
{ 
    YourWindowController* winController; 
} 
@end 

AppDelegate.m

@implementation AppDelegate 
- (void)applicationDidFinishLaunching:(NSNotification*)notification 
{ 
    winController = [[YourWindowController alloc] init]; 
    [winController showWindow:self]; 
} 
- (void)dealloc 
{ 
    [winController release]; 
    [super dealloc]; 
} 
@end 

YourWindowController.m

@implementation YourWindowController 
- (id)init 
{ 
    self=[super initWithWindowNibName:@"YourWindowNibName"]; 
    if(self) 
    { 
     //perform any initializations 
    } 
    return self; 
} 
@end 
+0

謝謝!感謝幫助。 – 2010-04-24 18:52:45

14

這是完全正常的通過筆尖實例窗口控制器。而不是使用windowDidLoad作爲你的掛鉤,在這種情況下,你會想要使用awakeFromNib

+0

優秀!謝謝。 – ArtOfWarfare 2013-05-05 06:02:24

0

如果你寫

TTEst *test3 = (TTEst *)[[NSWindowController alloc] initWithWindowNibName:@"TTEst"]; 

嘗試,而不是

TTEst *test3 = [[TTEst alloc] initWithWindowNibName:@"TTEst"]; 

它所產生的不同!當然,第一行是一個錯誤...