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