我有一个BaseClass
UIViewController类。它运作良好。 BaseClass
有BaseClass.xib
然后我创建了该基类的子类。
原来并没有连接插座。
我把
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
return self;
}
是的,它就是这样。它被称为。我不确定aDecoder是什么。我认为它是childClass的XIB的表示,它不存在。我希望用超级的xib初始化super。
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
}
return self;
}
永远不会打电话给。
事实上,我对自己很困惑。当我们有xib时,似乎-(id)initWithCoder:(NSCoder *)aDecoder
是被调用的那个。所以我想知道initWithNibName用于什么?
我试过
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithNibName:NSStringFromClass([super class]) bundle:nil];
return self;
}
答案 0 :(得分:4)
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle
是UIViewController
的指定初始值设定项。所以在你继承的类中,
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:@"BaseClass" bundle:nibBundleOrNil];
if (self) {
}
return self;
}
每当Apple将初始化程序标记为指定的初始值设定项时,其他初始值设定项将仅指向指定的初始值设定项。您不需要实现其他初始化程序。
NIB加载使用initWithCoder,这就是你在加载nib时看到它被调用的原因。
答案 1 :(得分:0)
如果要更改对象的初始化方式或执行其他初始化,则只需覆盖init方法。从xib加载UIViewController
(或任何内容)时,在调用init
方法时,您的商店仍无法连接。
一旦加载了xib中的所有对象并建立了连接,就会调用awakeFromNib
。实现它以查看是否所有内容都已正确加载(它应该)。