web-dev-qa-db-fra.com

Quand devrais-je initialiser un contrôleur de vue à l'aide de initWithNibName?

Quand dois-je utiliser init: et quand dois-je utiliser initWithNibName:bundle: lors de la création d'un contrôleur de vue?

45
Anthony Glyadchenko

-initWithNibName:bundle: est l'initialiseur désigné pour UIViewController. Quelque chose devrait éventuellement l'appeler. Cela dit, et malgré les exemples d'Apple (qui préconisent souvent la brièveté plutôt que la maintenabilité), l'appel ne doit jamais être appelé de l'extérieur du contrôleur de vue lui-même.

Vous verrez souvent un code comme celui-ci:

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

Je dis que c'est incorrect. Il place les détails de l'implémentation (le nom de la NIB et le fait qu'une NIB est même utilisée) dans l'appelant. Cela casse l'encapsulation. La bonne façon de faire est:

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

Ensuite, dans 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;
}

Cela ramène les détails d'implémentation de la clé dans l'objet et empêche les appelants d'interrompre accidentellement l'encapsulation. Désormais, si vous modifiez le nom de la carte NIB ou passez à une construction par programme, vous le corrigez à un endroit (dans le contrôleur de vue) plutôt que partout où le contrôleur de vue est utilisé.

134
Rob Napier

Utilisez initWithNibName si vous ... initialisez avec un fichier nib! C'est-à-dire un fichier que vous avez créé à l'aide d'Interface Builder.

Si vous n'utilisez pas IB pour organiser vos vues, vous pouvez simplement utiliser init.

6
bpapa

Vous pouvez simplement appeler init, tant que xib a le même nom que la classe du contrôleur de vue. L'encapsulation n'est pas nécessaire. Cela évite de taper, mais peut ne pas servir la clarté.

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

en utilisant init lorsqu'il n'y a pas de fichier nib/xib, par exemple. Les interfaces sont créées par codage

en utilisant initWithNibName, si nous avons un nib/xib ou le même contrôleur partagé par plus de 1 nib/xib

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

c'est ce que je pense..

0
JosephT