0

我从 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 窗口,但子视图没有元素。如何访问窗口子控件?谢谢,

4

1 回答 1

1

显示 NIB 窗口,但subviews没有元素。

您可能忘记将窗户插座连接到窗户。当插座未连接时,插座属性成立nil,因此[self window]返回nil

然后你发送消息到nil。我说“消息”是因为每条消息nil都不做任何事情并返回nil, 0, 或0.0适当时返回。这意味着您将contentView消息发送到nil,所以返回nil,这意味着您将subviews消息发送到nil,所以也返回nil

正如我所说,要nil返回的消息nil, 0, 或0.0; 当您将count消息发送到时controls,如上一段所述,该消息将返回。controlsnil0

解决方法是在 IB 中打开您的笔尖并将控制器的window插座连接到您的窗口。

顺便说一句,你不应该使用索引来循环 NSArrays。有一种更简单、更简洁的方法:快速枚举

于 2010-07-18T03:23:33.860 回答