2012-03-05 17 views
18

私は[super loadView]を決して呼び出すべきではないと思っていましたが、何か私を混乱させています。 loadViewメソッドの説明では[super loadView]を呼び出すことはできますか?

は(UIViewController Class Referenceは)「この方法のカスタム実装はsuperを呼び出すべきではありません。」と言われ、 はなく、ZoomingPDFViewerの例では、彼らが与えたことを、loadViewメソッドの実装(ZoomingPDFViewerViewControllerは)[スーパーloadViewメソッド]呼びかけています。

私はloadViewメソッドから呼び出そうとしましたが、うまくいきましたが、スーパーを呼び出さないという意味は理解できません。

答えて

25

あなたは間違いなく[super loadView]に電話すべきではありません。私はあなたがZoomingPDFViewerの例でバグを発見したと思います。

(xibを使用せずに)ビューコントローラのビュー階層をプログラムで作成する場合は、loadViewを上書きします。

あなたが指摘したように、文書はっきりとはsuperと呼んではいけないと述べています。

このメソッドのカスタム実装では、superを呼び出すべきではありません。

ビューコントローラが持っている場合:私は、これがXIBからこの方法はXIBからビューをロードするためにベースによって使用されるプログラムでビューを作成する両方のローディングを回避することであると仮定

このメソッドは、nibファイルからビューをロードします( )。

も注意している、あなたのUIViewControllerオブジェクトの割り当て時にあなたがloadViewUIViewController実装は、それの関連するクラス名を持つ任意のXIBをロードしようとするnibNameOrNilパラメータにnilを渡す場合でも。

ビューコントローラは、関連するnibファイルを持っている場合、明示的に使用してそれをペン先 ファイルを割り当てた場合、ビューコントローラは 、ストーリーボードからインスタンス化された場合に発生する非ゼロ値を返し nibNameプロパティinitWithNibName:bundle:method、、またはiOSがアプリケーションバンドルのnib ファイルをビューコントローラの クラス名に基づく名前で検出した場合。ビューコントローラに関連付けられたnib ファイルがない場合、このメソッドは代わりにプレーンなUIViewオブジェクトを作成します。

この方法の本当の目的は、あなたのXIBローディング機構に組み込まれたに頼らずにビュー階層を構築するの完全な制御を与えることです。:

あなたを作成するために、このメソッドをオーバーライドすることができます手動でビューを表示します。個人的に

場合、私はloadViewをオーバーライドします。1.)私はそれのためになるだろうXIBは本当に些細であるか、2)コントロールのレイアウトは非常に動的であるため、静的なレイアウトでXIBを作成することはほとんど利益を持っています。

+1

長さの+1マークアップを明瞭に/簡潔に... – Damo

0

IBでビューを作成していない場合は、コード内の[super loadView]を呼び出してプログラムにビューを渡す必要があります。

カスタムビューの場合は、インターファズビルダーを使用してビューを作成すると仮定しているため、呼び出す必要はありません。

+0

しかし、「このメソッドのカスタム実装でsuperを呼び出すべきではありません」とはどういう意味ですか? – Aleksa

+1

これはビューを作成していることを意味するので、スーパーロードする必要はありません。 –

+1

あなたは次のようなことを行うことでプログラムにビューを与えます: 'UIView * myView = [[[UIView alloc] init] autorelease]; ...(ビュー階層を作成する)... self.view = myView; 'self.view'を新しい値に代入していない場合、まず' loadView'をオーバーライドするのは何ですか? – Sam

1

NSViewControllerは、-loadViewのnibからビューを初期化しようとします。あなたのペン先名はコントローラのために設定されていないので、あなたには単にself.view = nil;私はUIViewController同じように動作すると仮定します。

安全なはずですが、完全に不要です。

+3

ビューコントローラ名に基づいた名前のxibがあった場合、 '[super loadView]'を呼び出すと '自己。私は実際にこれが起こったことは決して見たことがありません(私はスーパーを呼ぶことはありません)が、私が期待しているドキュメントに基づいています。また、 '[super loadView]'を呼び出すと、あなたのコードがしなければならないものである 'self.view'に総称的なビューを最小限に割り当てることができると思います。これは何も害を与えません( 'loadView'のカスタム実装がsuperを呼び出した後に' self.view'に値を代入すると仮定します)が、無駄です。 – Sam

0

プログラムでViewControllerを作成する場合は、override func loadView()の先頭にself.view = UIView(frame: UIScreen.main.bounds)の代わりにsuper.loadView()を呼び出して、ビューの階層を構築できます。ただし、super.loadView()に電話して、カスタムUIViewController.viewを同時に作成しないでください。 Appleのマニュアルを説明するロボットが好きではありません。

関連する問題