wake-up-neo.com

Wann sollte ich einen View-Controller mit initWithNibName initialisieren?

Wann sollte ich init: verwenden und wann sollte ich initWithNibName:bundle: beim Erstellen eines View-Controllers verwenden?

45

-initWithNibName:bundle: ist der angegebene Initialisierer für UIViewController. Irgendetwas sollte es irgendwann nennen. Das heißt, und trotz Apples Beispielen (die in vielen Fällen die Kürze der Wartbarkeit vorziehen), sollte es niemals von außerhalb des View-Controllers aufgerufen werden.

Sie werden häufig Code wie folgt sehen:

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

Ich sage das ist falsch. Es fügt Implementierungsdetails (den Namen der NIB und die Tatsache, dass sogar eine NIB verwendet wird) in den Anrufer ein. Das bricht die Kapselung. Der richtige Weg dies zu tun ist:

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

Dann in 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;
}

Dadurch werden die Schlüsselimplementierungsdetails wieder in das Objekt verschoben und verhindert, dass Anrufer versehentlich die Kapselung brechen. Wenn Sie jetzt den Namen der NIB ändern oder zur programmatischen Konstruktion wechseln, fixieren Sie sie an einer Stelle (im View-Controller) und nicht an jedem Ort, an dem der View-Controller verwendet wird.

134
Rob Napier

Verwenden Sie initWithNibName, wenn Sie ... mit einer Nib-Datei initialisieren! Das ist eine Datei, die Sie mit dem Interface Builder erstellt haben.

Wenn Sie IB nicht zum Layout Ihrer Ansichten verwenden, können Sie einfach init verwenden.

6
bpapa

Sie können init einfach aufrufen, solange das xib den gleichen Namen wie die View Controller-Klasse hat. Die Kapselung ist nicht erforderlich. Dies erspart das Tippen, kann jedoch nicht der Klarheit dienen.

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

verwenden von init, wenn keine Nib/Xib-Datei vorhanden ist, z. Die Benutzeroberfläche wird durch Codierung erstellt

using initWithNibName, wenn wir eine Nib/Xib oder dieselbe Controller-Freigabe von mehr als 1 Nib/Xib haben

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

das ist was ich denke..

0
JosephT