Свяжите IBOutlets при создании экземпляра UIView с использованием файла NIB.

Я создал объект UIView, используя содержимое файла NIB следующим образом:

self.results = [[[NSBundle mainBundle] loadNibNamed:@"ResultsView" owner:self options:nil] lastObject];
self.results.frame = CGRectMake(0, 0, 320, 500);

Но self.results на самом деле является подклассом UIView:

@interface GameResultsView : UIView {
  UILabel *title;
}
@property (nonatomic, retain) IBOutlet UILabel *title;

@end

Я связал атрибут title, определенный в GameResults, с объектом UILabel через Interface Builder. Но во время выполнения приложение останавливается с сообщением SIGABRT, когда представление назначено self.results:

-[UILabel copyWithZone:]: unrecognized selector sent to instance 0x4c2f780
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UILabel copyWithZone:]: unrecognized selector sent to instance 0x4c2f780'

Такое впечатление, что метка вообще не может быть подключена. Как правильно это сделать (если есть)? Моя цель здесь — добавить это пользовательское представление к объекту UIScrollView.

Спасибо!

ОБНОВЛЕНИЕ: я использую Xcode 4


person elitalon    schedule 20.05.2011    source источник
comment
@elitalon, вы используете XCode3 или 4?   -  person Nick Weaver    schedule 21.05.2011
comment
@Ник Уивер, я использую Xcode 4   -  person elitalon    schedule 21.05.2011
comment
@elitalon выберите свой собственный вид GameResultsView в IB, затем откройте «Утилиты» и выберите «Инспектор удостоверений». Что написано в поле «Пользовательский класс»?   -  person Nick Weaver    schedule 21.05.2011
comment
@Nick Weaver Я установил GameResultsView.   -  person elitalon    schedule 21.05.2011
comment
@elitalon, вы синтезировали методы доступа для метки? Является ли self.results типа GameResultsView *? Можете ли вы убедиться, что NSBundle/loadNibNamed возвращает ваше представление и относится к правильному классу?   -  person Nick Weaver    schedule 21.05.2011
comment
@Nick Weaver Да, я синтезировал его, и атрибут имеет класс GameResultsView. Однако похоже, что метод loadNibNamed не возвращает ожидаемое значение. Я дам Вам знать. Спасибо!   -  person elitalon    schedule 23.05.2011


Ответы (1)


Вы можете загрузить перо следующим образом:

UINib * nib = [UINib nibWithNibName:aName bundle:nil];

NSArray * nibContent = [nib instantiateWithOwner:self options:nil];

for (id aView in nibContent) {
    if ([aView isKindOfClass:[GameResultsView class]]) {
         return aView;
    }
}

Это вернет первое вхождение GameResultsView.

person Nick Weaver    schedule 23.05.2011
comment
Ключевым шагом была передача фактического объекта методу instantiateWithOwner:. Я должен передать self.results в качестве параметра после его выделения и инициализации. - person elitalon; 23.05.2011