如何使用xib文件为自定义UIView类编写init方法

时间:2014-01-14 20:58:53

标签: ios objective-c uiview xib

我使用界面构建器创建了简单视图。此视图有一个标签。你知道如何为这个类创建init方法吗?我写了自己的版本,但我不确定它是否正确。

@interface AHeaderView ()
@property (nonatomic, weak) IBOutlet UILabel *descriptionLabel;

@end

@implementation AHeaderView

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // add subview from nib file
        NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"AHeaderView" owner:nil options:nil];

        AHeaderView *plainView = [nibContents lastObject];
        plainView.descriptionLabel.text = @"localised string";
        [self addSubview:plainView];
    }
    return self;
}

-------------------------------- version 2 ------------- --------------------

@interface AHeaderView ()
@property (nonatomic, weak) IBOutlet UILabel *descriptionLabel;

@end

@implementation AHeaderView

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        self.descriptionLabel.text = @"localised string"
    }
    return self;
}

在ViewController类中加载:

NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"AHeaderView" owner:nil options:nil];
AHeaderView *headerView = [nibContents lastObject];

-------版本3 -------

@interface AHeaderView ()
@property (nonatomic, weak) IBOutlet UILabel *descriptionLabel;

@end

@implementation AHeaderView

- (void)awakeFromNib {
    [super awakeFromNib];
    self.descriptionLabel.text = @"localised string"
}

@end

1 个答案:

答案 0 :(得分:5)

从XIB加载视图时initWithFrame:将不会被调用。相反,方法签名应为- (id)initWithCoder:(NSCoder *)decoder

在这种情况下,您不应该在单位方法中加载NIB。其他一些类应该从NIB加载视图(如控制器类)。

您目前所拥有的结果是没有标签集的视图,其中包含带有标签的子视图(带有一些文本)。