2010-07-18 89 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