从xib加载UIView,在尝试访问IBOutlet时崩溃

时间:2011-05-18 02:22:39

标签: iphone xcode uiview nib

我有一个xib文件,上面有一个小UIView,后面又包含一些标签。现在,我正在尝试将UIView加载到现有UIViewController中,并更改其中一个标签文本。我想这样做的原因是,UIView将重复使用不同的标签文本,所以我想制作一个自定义类并从xib加载它将是最好的方法。

我已经尝试了几种加载它的方法,并且我已经在我的viewcontroller上成功显示了它。问题是,一旦我尝试在Interface Builder中实际链接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)];

到目前为止,这么好。它完全按照.xib中的布局显示UIView。 但是一旦我尝试改变headline.text就像这样:

panelView.headline.text = @"Test";

它崩溃了这个错误: 由于未捕获的异常'NSInvalidArgumentException'而终止应用,原因:' - [UIView标题]:无法识别的选择器发送到实例0x5c22b00'

这可能是我忽略的一些小事,但到目前为止,它已经让我疯了几个小时。有没有人有任何想法?

1 个答案:

答案 0 :(得分:20)

您将自定义视图的类重新分配给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;
}