web-dev-qa-db-ja.com

initWithNibNameを使用してView Controllerをいつ初期化する必要がありますか?

View Controllerの作成時にinit:をいつ使用し、initWithNibName:bundle:をいつ使用する必要がありますか?

48

-initWithNibName:bundle:は、UIViewControllerの指定された初期化子です。何かが最終的にそれを呼び出す必要があります。とはいえ、Appleの例(多くの場合、保守性よりも簡潔さを好む)にもかかわらず、View Controllerの外部から呼び出されることはありません。

多くの場合、次のようなコードが表示されます。

MYViewController *vc = [[MYViewController alloc] initWithNibName:@"Myview" bundle:nil];

私はこれが間違っていると言います。呼び出し元に実装の詳細(NIBの名前とNIBが使用されることさえある)を入れます。それはカプセル化を壊します。これを行う正しい方法は次のとおりです。

MYViewController *vc = [[MYViewController alloc] init];

次に、MYViewControllerで:

- (instancetype)init
{
   self = [super initWithNibName:@"Myview" bundle:nil];
   if (self != nil)
   {
       // Further initialization if needed
   }
   return self;
}

- (instancetype)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle
{
    NSAssert(NO, @"Initialize with -init");
    return nil;
}

これにより、主要な実装の詳細がオブジェクトに戻され、呼び出し元がカプセル化を誤って壊すことを防ぎます。 NIBの名前を変更するか、プログラムによる構成に移行する場合、View Controllerが使用されるすべての場所ではなく、1つの場所(View Controller内)で修正します。

137
Rob Napier

つかいます initWithNibName: bundle:もし…なら、nibファイルで初期化しています!つまり、Interface Builderを使用して作成したファイルです。

ビューのレイアウトにIBを使用していない場合は、initを使用できます。

6
bpapa

Xibの名前がView Controllerクラスと同じである限り、initを呼び出すことができます。カプセル化は必要ありません。これにより、入力が節約されますが、わかりにくい場合があります。

 NUDMainViewController *mainVC = [[NUDMainViewController alloc] init];
2
Kiet Nguyen

nib/xibファイルがないときにinitを使用します。 UIはコーディングによって作成されます

nib/xibまたは同じコントローラーが複数のnib/xibで共有している場合は、initWithNibNameを使用します

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
     self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil];
 } else {
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil];
 }

それが私が思うことです。

0
JosephT