Загрузка UIView из xib, сбой при попытке доступа к IBOutlet

У меня есть xib файл с небольшим UIView на нем, который, в свою очередь, содержит некоторые метки. Теперь я пытаюсь загрузить этот UIView в существующий UIViewController и изменить один из текстов меток. Причина, по которой я хочу это сделать, заключается в том, что UIView будет повторно использоваться с разными текстами меток, поэтому я решил, что создание пользовательского класса и загрузка его из xib будет лучшим способом.

Я попытался несколько способов загрузить его, и я успешно отобразил его на моем контроллере view. Проблема в том, что, как только я попытаюсь связать IBOutlet в Interface Builder и получить к нему доступ, мое приложение аварийно завершает работу.

Я создал собственный UIView класс, который выглядит следующим образом:

CoverPanel.h

@interface CoverPanel : UIView {

    IBOutlet UILabel *headline;

}

@property (nonatomic, retain) IBOutlet UILabel *headline;

@end

CoverPanel.m

@implementation CoverPanel

@synthesize headline;

- (id)initWithFrame:(CGRect)frame 
{
    self = [super initWithFrame:frame];
    if (self) 
    {
        // Initialization code.
        //
        self = [[[NSBundle mainBundle] loadNibNamed:@"CoverPanel" owner:self options:nil] objectAtIndex:0];
    }
    return self;
}

В CoverPanel.xib я связал UILabel с выводом заголовка. В моем контроллере view здесь я создаю экземпляр CoverPanel, и это происходит сбой:

CoverPanel *panelView = [[CoverPanel alloc] initWithFrame:CGRectMake(0,0,300,100)];

До сих пор так хорошо. Он отображает UIView точно так же, как и в xix. Но как только я попытаюсь изменить headline.text так:

panelView.headline.text = @"Test";

он вылетает с этой ошибкой: Завершение приложения из-за неперехваченного исключения "NSInvalidArgumentException", причина: '- [Заголовок UIView]: непризнанный селектор, отправленный экземпляру 0x5c22b00'

Это может быть что-то маленькое, что я пропускаю, но он покачал меня безумным в течение нескольких часов и часов. Кто-нибудь знает?

Ответ 1

Вы переназначили свой собственный класс представления в представление, которое было в вашем xib. Вам не нужно это делать, потому что тогда вы вернулись из вида xib, и вы только что пропустили свой CoverPanel. Итак, просто замените свой инициализатор:

- (id)initWithFrame:(CGRect)frame 
{
    self = [super initWithFrame:frame];
    if (self) 
    {
        // No need to re-assign self here... owner:self is all you need to get
        // your outlet wired up...
        UIView* xibView = [[[NSBundle mainBundle] loadNibNamed:@"CoverPanel" owner:self options:nil] objectAtIndex:0];
        // now add the view to ourselves...
        [xibView setFrame:[self bounds]];
        [self addSubview:xibView]; // we automatically retain this with -addSubview:
    }
    return self;
}