2010-08-22 56 views
2

我有一個NSWindowController子類具有以下實現所謂_PreferencesWindowController -NSWindowController:從筆尖但的ShowWindow LOADWINDOW負荷窗口:什麼也不做

@synthesize window; 

- (id)init { 

self = [super initWithWindowNibName:@"PreferencesWindow"]; 
if (!self) return nil; 

return self; 
} 

我嘗試用下面的代碼顯示窗口中_PreferencesWindowController -

_preferencesWindowController = [[_PreferencesWindowController alloc] init]; 
[_preferencesWindowController showWindow:nil]; 

它什麼也沒做,我從調試器檢查_preferencesWindowController.windownil

但是,如果我打電話loadView_preferencesWindowController窗口可以加載,並可見; _preferencesWindowController.window不再是零值 -

[_preferencesWindowController loadWindow]; 

我看着蘋果的NSWindowController文檔就明確表示,「你永遠不應該直接調用loadWindow」,而不是showWindow:應該被使用。我想知道我可能錯過了什麼,導致了上述我見過的行爲。

回答

2

好的我通過查看NSWindowController頭文件解決了這個問題。

的問題是在我的_PreferencesWindowController頭文件 -

@interface _PreferencesWindowController : NSWindowController <NSToolbarDelegate> { 

    NSWindow *window; 

} 

@property (assign) IBOutlet NSWindow *window; 

@end 

通過消除@property聲明和改變NSWindow *window伊娃到IBOutlet NSWindow *windowshowWindow:方法現在工作無故障。

屬性聲明必須在NSWindowController的實現中導致showWindow:方法中的未定義行爲。

+3

聲明屬性不是問題,但綜合它可能已經-WindindowController已經有一個'window'的實現,它不僅僅是一個簡單的屬性訪問器。不論你是否用'IBOutlet'(與編譯器無關或在運行時)聲明它,因爲NSWindowController已經有了這個名字的出口ivar。你應該切掉伊娃*和*財產。 – 2010-08-22 05:28:09

+0

你說得對。無論我是否聲明瞭伊娃,我的子類在Interface Builder中看到了'window' ivar。和你的建議解決了我用' - [NSOpenPanel beginSheetModalForWindow:completionHandler:]''謝謝! :) – koo 2010-08-22 07:42:39