2010-07-18 88 views
0

我繼承了從NSWindowController一個新的類來實現windowDidLoad,然後接入到NIB定義的窗口控件:訪問NIB窗口控制

- (void) windowDidLoad 
{ 
    NSArray * controls = [ [ [ self window ] contentView ] subviews ]; 
    int i; 

    NSRunAlertPanel(@"windowDidLoad", @"", @"OK", NULL, NULL); 

    if([ controls count ] == 0) 
     NSRunAlertPanel(@"no hay controles", @"", @"OK", NULL, NULL); 

    for(i = 0; i < [ controls count ]; i++) 
     NSRunAlertPanel(@"control", @"", @"OK", NULL, NULL); 
} 

代碼執行去罰款。顯示NIB窗口,但子視圖沒有元素。如何訪問窗口子控件?謝謝,

回答

1

顯示NIB窗口,但subviews沒有元素。

你可能忘了把窗口連接到你的窗口。當插座沒有連接時,插座屬性爲nil,所以[self window]返回nil

然後你發送消息到nil。我說「消息」,因爲every message to nil does nothing and returns nil, 0, or 0.0 as appropriate。這意味着您發送contentView消息到nil,以便返回nil,這意味着您將subviews消息發送到nil,以便還返回nil

正如我所說,給nil的消息返回nil00.0;當您將count消息發送到controls時,由於controlsnil,如前段所述,該消息返回0

修復方法是在IB中打開您的筆尖,然後將控制器的window插座連接到您的窗口。

順便說一下,你不應該使用索引來遍歷NSArrays。有一個更簡單,更乾淨的方式來做到這一點:Fast Enumeration

+0

以編程方式創建繼承的類windowController。如何連接窗口?謝謝, – 2010-07-18 06:55:25

+0

我認爲你讓一個類與一個實例混淆。窗口控制器對象是NSWindowController類的一個實例,或者是從NSWindowController繼承的一個類的實例。 「以編程方式」做某件事是指以一個或多個陳述來做;以編程方式創建類是非常困難的(更不用說沒有意義),所以你幾乎可以肯定是在實例化它,這是無關緊要的:沒有其他方法來實例化NSWindowController。 (你*可以*創建一個筆尖,但沒有意義。) – 2010-07-18 07:03:23

+0

至於連接插座:http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/IB_UserGuide/ – 2010-07-18 07:04:21