2012-01-30 28 views
20

initinitWithNibNameの実用的な相違点について詳しく知りたい場合は、 thisのような答えは、「init」を通じて間接的に「initWithNibName」と呼ぶほうがよいことを示唆しています。UIViewController(initおよびinitWithNibName)

  1. 「init」と 「initWithNibName」を別々に定義する必要がある状況はありますか?
  2. 1回のプログラム実行中にNibファイルを複数回ロードする必要がありますか? ?
  3. 質問1 & 2関連性がありますか?最初の質問の

答えて

30

をロードされていることは、initを介して間接的にinitWithNibName:を呼び出すために良いとは限りません。ある時点でinitWithNibName:に電話するだけです。あなたはそれを外部的または内部的に行うことができます。内部的に行う方が良いと考える人もいます。実際にレイアウト関連のコードを何度も書くのを避けるために、レイアウト関連のヘルパーメソッドを保持する「LayoutUtil」というクラスがあります。ここでのUIViewControllerをロードするための私のコードは次のとおりです。

+ (id)loadController:(Class)classType { 
    NSString *className = NSStringFromClass(classType); 
    UIViewController *controller = [[classType alloc] initWithNibName:className bundle:nil]; 
    return controller; 
} 

そして私はちょうど行うことができます。

MyViewController *c = [LayoutUtil loadController:[MyViewController class]]; 

したい場合は、あなたがクラスにughhhhというメソッドを追加し、そこにそれを呼び出すことができ、それは全く問題ではありません。要点は、initメソッドでinitWithNibNameを呼び出す方が良い習慣ではないということですが、UIViewControllerを開始するときに、ある時点で呼び出すようにしたいだけです。

- (id)ughhhh 
{ 
    self = [super initWithNibName:@"Myview" bundle:nil]; 
    if (self != nil) 
    { 
    } 
    return self; 
} 

nibファイルを複数回読み込む必要があります。 UIViewControllerでinitWithNibNameを呼び出すたびにxibをロードする必要があります。あなたはペン先をロードします。この関数を呼び出す

[[NSBundle mainBundle] loadNibNamed:@"nameOfXIBFile" owner:self options:nil]; 

毎回:多くの人々は、このようのUIViewControllerが所有していないUIViewsをロードします。

ペン先がキャッシュされる場合があります。例としてはUITableViewがありますが、テーブルビューには独自のキャッシュが実装されています。オペレーティングシステムは自動的にキャッシングを行っていません。

initinitWithNibName:は、initWithNibName:が自動的にオブジェクトに対してinitを呼び出します。

+1

+1、非常によく詳細...あなたの詳細な回答と種類の支援のための – doNotCheckMyBlog

+0

おかげで... – Stanley

+1

ジャストノート:自己に割り当てる、あなたが必要とします'init'で始まるメソッドを持っています。だから - (id)initUghhhh' – benaneesh

2

回答

理想的にはすべてのinitWithNibName通話init内部ビューはまたように、1つの場合にしてペン先フロンloadViewからロードされている場合は、通常の場合のシナリオの両方を定義する必要はありませんが、できるよう、別のケースでは異なるビューからのものです毎回ビューがスタックペン先にプッシュされる2番目の質問の

回答

は3番目の質問の

回答

+0

あなたの答えと種類の支援のおかげで... – Stanley

10

"init"で間接的に "initWithNibName"を呼び出す方が良いわけではありません。ニーズに合ったものを使用してください。 [[UIViewController alloc] init]と言っても[[UIViewController alloc] initWithNibName:nil bundle:nil]と同じように、渡す引数がある場合は、[[UIViewController alloc] init]を使用することもできます。ご質問への答えで

:あなたがしたい場合は

  1. あなたが異なっinitinitWithNibName:bundle:を定義することができます。それらのうちの1つだけを定義することができます。たとえば、UIImagePickerControllerinitのみを定義し、initWithNibName:bundle:を送信しようとすると正常に動作しません。あるいは、全く異なるinit...メソッドを定義することもできます。たとえば、UINavigationControllerは、initWithRootViewController:と定義します。定義するinitメソッドは、最終的にスーパークラスのinitメソッドの1つを呼び出さなければなりません。

  2. はい、ペン先は複数回ロードできます。同じView Controllerサブクラスのインスタンスを複数作成すると、同じnibを複数回ロードする可能性が高くなります。実際、ビューコントローラの単一のインスタンスがnibを複数回ロードすることは可能です。どうやって?ビューコントローラのビューが現在画面に表示されておらず、システムのメモリが不足している場合、システムはビューコントローラにビューの解放を依頼します。ビューコントローラが後でビューを画面に戻す必要がある場合は、再びペン先をロードします。

  3. 質問1と2は関連しません。

+0

あなたの詳細な答えと親切な援助をありがとう... – Stanley

関連する問題