3

BaseClassUIViewControllerクラスを取得しました。それはうまくいきます。BaseClassBaseClass.xibがあります

次に、その基本クラスのサブクラスを作成しました。

どのコンセントも接続されていないことがわかりました。

置いた

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

そして、はい、それは行きます。それは呼ばれています。aDecoderが何であるかわかりません。存在しないchildClassのXIBを表現したものだと思います。スーパーをスーパーのxibで初期化したい。

- (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 メソッドをオーバーライドするだけで済みます。a (または何か) を xib からロードする場合、メソッドが呼び出されUIViewControllerたときにアウトレットはまだ接続されていません。init

xib 内のすべてのオブジェクトがロードされ、接続がセットアップされると、awakeFromNibが呼び出されます。それを実装して、すべてが適切にロードされたかどうかを確認します (そうすべきです)。

于 2013-01-22T00:49:59.887 に答える