6

ポストUsing initWithNibName changes全くnothingで、彼は同じ View Nib 定義の 2 つの使用法を示しています。

したがって、これは常に機能しますが、次のようになります。

MyViewController *vctrlr = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; [self.navigationController pushViewController:vctrlr animated:YES]; [vctrlr release];

以下は、私が継承したすべてのView Controllerで機能しますが、私のものではありません!

TheirViewController *vctrlr = [[TheirViewController alloc] init]; [self.navigationController pushViewController:vctrlr animated:YES]; [vctrlr release];

iOS プログラミングは初めてなので、いくつかのコードを継承しました。すべてのビュー コントローラーのビューは IB で定義されていますが、これらのビュー コントローラーの割り当て/初期化の作成に一貫性がありませんでした。新しい View Controller と XIB を作成しましたが、initWithNibName を使用しないと機能しません (View Controller を Nav Controller にプッシュするとクラッシュします)。私のView Controllerが他のView Controllerとどのように違うのかわかりません...何かヒントはありますか?私以外のアプリ内の他のすべてのView ControllerのinitNibNameの使用を削除できました。

4

2 に答える 2

1

には任意の文字列名を渡すことができますinitWithNibName:initWithNibName:@"MyClassName"クラスが呼び出されたときに呼び出すだけに制限されているわけではありませんMyClassName。かもしれませんinitWithNibName:@"MyClassNameAlternateLayout"

これは、アプリが何をする必要があるかに応じて、異なる nib をロードする必要がある場合に役立ちます。開発とメンテナンスを簡単にするために、デバイス カテゴリ (iPhone または iPad) ごとにビュー コントローラーごとに 1 つの nib を持つようにしていますが、開発者が別のレイアウトや別の機能を提供したい場合があるかどうかは理解できました。

もう 1 つの重要な点は、initWithNibName:bundle:が の指定された初期化子であることですUIViewController。を呼び出すと-[[UIViewController alloc] init]、 theninitWithNibName:bundle:がバックグラウンドで呼び出されます。これは、シンボリック ブレークポイントで確認できます。つまり、単にデフォルトの動作が必要な場合は、呼び出すことができ-[[UIViewController alloc] init]、指定された初期化子が暗黙的に呼び出されることが期待されます。

ただし、呼び出し-[[UIViewController alloc] init]ても期待どおりの動作が得られない場合は、UIViewController サブクラスが- (id)init正しく実装されていない可能性があります。実装は、次の 2 つの例のいずれかのようになります。

- (id)init
{
    self = [super init];
    if (self) {
        // custom initialization
    }
    return self;
}

また

- (id)init
{
    NSString *aNibName = @"WhateverYouWant";
    NSBundle *aBundle = [NSBundle mainBundle]; // or whatever bundle you want
    self = [self initWithNibName:aNibName bundle:aBundle];
    if (self) {
        // custom initialization
    }
    return self;
}
于 2013-09-27T23:36:56.153 に答える