Доступ к элементам управления окном NIB

Я унаследовал новый класс от 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, но в подпредставлениях нет элементов. Как получить доступ к дочерним элементам управления окна? Спасибо,


person AL FT    schedule 18.07.2010    source источник


Ответы (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, поскольку controls равно nil, как объяснялось в предыдущем абзаце, это сообщение возвращает 0.

Исправление состоит в том, чтобы открыть перо в IB и подключить window выход вашего контроллера к вашему окну.

Кстати, вы не должны использовать индексы для циклического обхода NSArrays. Есть более простой и понятный способ сделать это: Быстрое перечисление.

person Peter Hosey    schedule 18.07.2010
comment
Унаследованный класс windowController создается программно. Как подключить оконную розетку? Благодарность, - person AL FT; 18.07.2010
comment
Я думаю, вы путаете класс с экземпляром. Объект оконного контроллера является экземпляром класса NSWindowController или класса, наследуемого от NSWindowController. Выполнение чего-либо «программно» относится к выполнению этого в одном или нескольких операторах; создать класс программно очень сложно (не говоря уже о том, что это бессмысленно), поэтому вы почти наверняка имеете в виду создание его экземпляра, что не имеет значения: другого способа создать экземпляр NSWindowController не существует. (Вы могли создать его в пере, но в этом не было бы смысла.) - person Peter Hosey; 18.07.2010
comment
Что касается подключения к розетке: developer.apple.com/mac/library /documentation/Инструменты разработчика/ - person Peter Hosey; 18.07.2010
comment
Я не правильно объяснил. Я программно создаю экземпляр объекта windowController. Вопрос в том, как подключить окно NIB к моему контроллеру, чтобы окно данных не было нулевым? Благодарность, - person AL FT; 18.07.2010
comment
Исправление состоит в том, чтобы открыть перо в IB и подключить оконный выход вашего контроллера к вашему окну. Контроллер не существует в IB, поэтому я не могу установить его оконный выход. Это то, что я ищу, спасибо - person AL FT; 18.07.2010
comment
Этот пост, кажется, указывает на лучшее направление: osdir.com/ml/ coco-dev/2010-07/msg00252.html Вы не забыли подключить окно в пере к выходу окна владельца файла? Вы не забыли изменить идентификатор класса File's Owner на свой подкласс NSWindowController? - person AL FT; 18.07.2010
comment
Я создал для этого визуальное руководство: forums.fivetechsupport.com / - person AL FT; 18.07.2010
comment
Это не «лучшее направление», это направление, рекомендованное документами. - person Peter Hosey; 18.07.2010