Загрузка UIView из xib, вылетает при попытке доступа к IBOutlet - PullRequest
8 голосов
/ 18 мая 2011

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

Я пробовал несколько способов его загрузки и успешно отобразил его на моем viewcontroller.Проблема в том, что когда я пытаюсь на самом деле связать 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 Ответ

20 голосов
/ 18 мая 2011

Вы переназначили класс своего пользовательского представления на представление, которое находилось в вашем 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;
}
...