View Controllerの作成時にinit:
をいつ使用し、initWithNibName:bundle:
をいつ使用する必要がありますか?
-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内)で修正します。
つかいます initWithNibName: bundle:
もし…なら、nibファイルで初期化しています!つまり、Interface Builderを使用して作成したファイルです。
ビューのレイアウトにIBを使用していない場合は、init
を使用できます。
Xibの名前がView Controllerクラスと同じである限り、initを呼び出すことができます。カプセル化は必要ありません。これにより、入力が節約されますが、わかりにくい場合があります。
NUDMainViewController *mainVC = [[NUDMainViewController alloc] init];
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];
}
それが私が思うことです。