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

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

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

Я создал кастом 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 на выход заголовка. В моем viewcontroller, вот как я создаю CoverPanel экземпляр, и вот где он падает:

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

Все идет нормально. Он отображает UIView именно так, как это изложено в.xib. Но как только я пытаюсь изменить 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;
}
Другие вопросы по тегам