我正在尝试为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;
}
谢谢
答案 0 :(得分:0)
通常,nib用于实例化其代码独立的对象。 objectX的代码中没有使用objectX的nib。
当分配了SectionHeader并调用其init时,它会将自身传递给同一方法的BaseSectionHeader版本。但BaseSectionHeader会删除它并创建一个新对象以放入self。因此,SectionHeader将替换为BaseSectionHeader。
UINib调用实例化应该在MasterViewController中进行。