我从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窗口,但子视图没有元素。如何访问窗口子控件?谢谢,
答案 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
的邮件会返回nil
,nil
或0
;当您将0.0
邮件发送至count
时,由于controls
为controls
,如上一段所述,该邮件将返回nil
。
修复方法是在IB中打开笔尖并将控制器的0
插座连接到窗口。
顺便说一句,你不应该使用索引来遍历NSArrays。有一种更简单,更简洁的方法:Fast Enumeration。