访问NIB窗口控件

时间:2010-07-18 01:07:39

标签: cocoa nswindowcontroller

我从NSWindowController继承了一个新类来实现windowDidLoad,然后访问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 个答案:

答案 0 :(得分: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,这样也会返回{ {1}}。

正如我所说,发往nil的邮件会返回nilnil0;当您将0.0邮件发送至count时,由于controlscontrols,如上一段所述,该邮件将返回nil

修复方法是在IB中打开笔尖并将控制器的0插座连接到窗口。

顺便说一句,你不应该使用索引来遍历NSArrays。有一种更简单,更简洁的方法:Fast Enumeration