-initWithNibName:bundle:
est l'initialisateur désigné pour UIViewController. Quelque chose devrait éventuellement l'appeler. Cela dit, et malgré les exemples d'Apple (qui privilégient la brièveté à la facilité de maintenance dans de nombreux cas), il ne doit jamais être appelé en dehors 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. Les détails de l'implémentation (le nom de la NIB et le fait qu'une NIB soit utilisée) sont confiés à l'appelant. Cela brise l'encapsulation. La façon correcte de procéder est la suivante :
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 permet de replacer les détails clés de l'implémentation dans l'objet, et empêche les appelants de briser accidentellement l'encapsulation. Maintenant, si vous changez le nom du NIB, ou si vous passez à la construction programmatique, vous le corrigez à un seul endroit (dans le contrôleur de vue) plutôt qu'à chaque endroit où le contrôleur de vue est utilisé.
0 votes
Vous devez modifier la réponse sélectionnée pour cette question