如何从单个笔尖派生多个类

时间:2014-12-30 20:10:15

标签: xcode nib

我正在尝试为TableView创建一个通用SectionHeader的nib,因为我需要几个类似的SectionHeaders。我正试图关注这个SO帖子:

How to create multiple windows with the same nib file in xcode

在我的nib文件中定义的视图被赋予BaseSectionHeader的基类。这是它的初始化器:

BaseSectionHeader.m
- (id) initWithController:(MasterViewController*)ctlr;
{
    self = [[[UINib nibWithNibName:@"SectionHeader" bundle:nil] instantiateWithOwner:ctlr options:nil] objectAtIndex:0];
    if (self)
    {
        _controller = ctlr;
    }

    return self;
}

这是我想要派生的子类的初始化器:

SectionHeader.h

@interface SectionHeader : BaseSectionHeader <UIAlertViewDelegate>
…
@end

SectionHeader.m

- (id) initWithController:(MasterViewController*)ctlr
{
    if (self = [super initWithController:ctlr])
    {
        _deleteConfirmButtonWidth = 70.0;
    }

    return self;
}

以下是我实例化节标题的方法:

MasterViewController.m
…
    SectionHeader* hdr = [[SectionHeader alloc] initWithController:self];
…

问题是hdr作为BaseSectionHeader返回,而不是SectionHeader。如果我不使用nib并在代码中手动构造BaseSectionHeader,这可以正常工作。但是如果可以的话,我想用IB来构造BaseSectionHeader。

当我使用nib时,为什么hdr是BaseSectionHeader而不是SectionHeader?有没有办法使用nib并获得我想要的hdr子类?

FWIW这是我的手动代码:

BaseSectionHeader.m
- (id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame])
    {
        _label = [[UILabel alloc] initWithFrame:CGRectMake(10.0, 0.0, 275.0, 40.0)];
        [_label setTextColor:TanColor];
        [_label setNumberOfLines:2];
        [_label setLineBreakMode:NSLineBreakByTruncatingTail];
        [_label setAdjustsFontSizeToFitWidth:YES];
        [self addSubview:_label];
    }

    return self;
}

SectionHeader.m
- (id)initWithFrame:(CGRect)frame Controller:(MasterViewController*)ctlr
{
    if (self = [super initWithFrame:frame])
    {
        _controller = ctlr;
        _deleteConfirmButtonWidth = 70.0;

        _titleButton = [UIButton buttonWithType:UIButtonTypeCustom];
        _titleButton.frame = CGRectMake(10.0, 0.0, 275.0, 40.0);
        _titleButton.alpha = 0.3;
        [self addSubview:_titleButton];
    }
    return self;
}

谢谢

1 个答案:

答案 0 :(得分:0)

通常,nib用于实例化其代码独立的对象。 objectX的代码中没有使用objectX的nib。

当分配了SectionHeader并调用其init时,它会将自身传递给同一方法的BaseSectionHeader版本。但BaseSectionHeader会删除它并创建一个新对象以放入self。因此,SectionHeader将替换为BaseSectionHeader。

UINib调用实例化应该在MasterViewController中进行。