3

我有一个BaseClassUIViewController 类。它运作良好。BaseClass有 BaseClass.xib

然后我创建了该基类的子类。

结果没有一个插座连接。

我放

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    return self;
}

是的,就这样。它被称为。我不确定 aDecoder 是什么。我认为它是 childClass 的 XIB 的表示,它不存在。我想用super的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;
}
4

2 回答 2

5

- (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 时看到它被调用的原因。

于 2013-01-22T00:48:56.843 回答
0

如果要更改对象的初始化方式或进行其他初始化,则只需覆盖 init 方法。从 xib加载(或任何东西)时,调用该方法UIViewController时您的插座将不会连接。init

一旦加载了 xib 中的所有对象并设置了连接,awakeFromNib就会被调用。实现它以查看是否所有内容都已正确加载(应该)。

于 2013-01-22T00:49:59.887 回答