web-dev-qa-db-ja.com

nibs / xibsなしのUIViewControllerでのloadViewおよびviewDidLoadの適切な使用

Nibなしでプログラミングすると、次のようにビューを初期化するためにloadViewを呼び出す必要があるという印象を受けます。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nil bundle:nil];
    if (self) {
        // Custom initialization
        [self loadView];
    }
    return self;
}

(nibがないため、nibNameOrNil = nilを設定しました。)

次に、次のようにビューを設定します。

- (void) loadView {
    self.view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 367)];
    [self viewDidLoad];
}

これは、viewDidLoadの他のすべてを実行します。

この方法でloadViewとviewDidLoadを呼び出す必要があるかどうかはまだわかりません。それらは自動的に呼び出されません。

混乱しているのは、UIViewControllerクラスリファレンスのドキュメントです。

loadViewディスカッション

このメソッドを直接呼び出さないでください。ビューコントローラーは、ビュープロパティが要求されたが現在はnilのときにこのメソッドを呼び出します。 ビューを手動で作成する場合は、このメソッドをオーバーライドし、それを使用してビューを作成する必要があります。 Interface Builderを使用してビューを作成し、View Controllerを初期化する場合、つまり、 initWithNibName:bundle:メソッドを使用するか、nibNameプロパティとnibBundleプロパティを直接設定するか、Interface Builderでビューとビューコントローラの両方を作成します。この場合、このメソッドをオーバーライドしないでください。

したがって、直接呼び出す必要がない場合にloadViewが呼び出される方法がわかりません。

このメソッドのデフォルト実装は、有効なnib情報を探し、その情報を使用して関連するnibファイルをロードします。 nib情報が指定されていない場合、デフォルトの実装はプレーンなUIViewオブジェクトを作成し、それをメインビューにします。

私はそれがどのように機能するのか理解していません-苦痛なUIViewの作成。

ビューを手動で作成するためにこのメソッドをオーバーライドする場合は、それを行い、階層のルートビューをビュープロパティに割り当てる必要があります。 (作成するビューは一意のインスタンスでなければならず、他のビューコントローラーオブジェクトと共有しないでください。)このメソッドのカスタム実装は、superを呼び出さないでください。

ビューの追加の初期化を実行する場合は、viewDidLoadメソッドで行います。 iOS 3.0以降では、viewDidUnloadメソッドもオーバーライドして、ビューまたはそのコンテンツへの参照を解放する必要があります。

さて、これまでのところ、viewDidLoadの呼び出し方法については説明していません。したがって、viewDidLoadの場合:

viewDidLoadディスカッション

このメソッドは呼び出されますビューコントローラが関連するビューをメモリにロードした後。 このメソッドは無関係に呼び出されますビューがnibファイルに保存されたか、loadViewメソッドでプログラムによって作成されたか。このメソッドは、nibファイルからロードされたビューで追加の初期化手順を実行するために最も一般的に使用されます。

何で呼ばれた?

これらのメソッドはコードで自動的に呼び出されないため、自分で呼び出す必要があると考えざるを得ません。しかし、これが正しいことであるというドキュメントからの明確な理解はまだ得られていません。

26
Draco

ドキュメンテーションが言うように、これらのメソッドを自分で呼び出すべきではありません。

これが機能する方法は、UIKitのコードがloadViewメソッドを呼び出すのは、そのコントローラーのビュー階層を実際に画面に表示する必要がある場合です。

具体的には、コードがビューコントローラーのviewプロパティを読み取ろうとし、そのプロパティがnilの場合、UIViewControllerのコードはloadViewメソッドを呼び出します。 loadViewを自分で実装しない場合、デフォルトの実装はnibからビュー階層をロードしようとすることにフォールバックします。

これは、ビューコントローラーを表示しようとして、ビューがnilの場合、すべて自動的に行われます。 (これは、メモリプレッシャーに応じてビューコントローラーがビューをアンロードする必要がある場合、アプリの実行中に複数回発生する可能性があります。「無料」で別の動作が発生し、自分自身を呼び出したくない場合)

これらのメソッドがビューコントローラーで呼び出されていない場合は、このビューコントローラーの表示方法に何らかの問題があり、UIViewControllerのフレームワークコードがこれらのメソッドを呼び出すことができません。そのコードを投稿してください。誰かがそのバグを理解するのに役立ちます。

ただし、thatバグを修正する前に、コードからこれらを削除する必要があります。

[self loadView]
[self viewDidLoad]

そして、独自のviewDidLoadの実装では、スーパークラスの実装を[super viewDidLoad]で呼び出します。

loadViewでは、self.viewを有効なビューに設定するのはあなたの唯一の責任です。それでおしまい。 UIKitコードはそれを見て、viewDidLoadを呼び出します。

お役に立てば幸いです。

34
Firoze Lafeer

Firoze Lafeerによる答えは正しいです。force loadビューのプロパティを表示する方法正しい方法

(void)self.view;

これを行うべきではありません!必要な場合は、何か間違っているのですが、-loadViewを呼び出さないでくださいおよび-viewDidLoad自分の状況にかかわらず。

8
Tricertops