Загрузка 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;
}