53 votes

Lequel dois-je utiliser, -awakeFromNib ou -viewDidLoad?

J'ai récemment eu un problème dans mon application, où certains des sous-vues, j'ai été la création d'une sous-classe UIViewController de l' -awakeFromNib méthode étaient en train de disparaître de la vue. Après quelques farfouillé, j'ai trouvé que le fait de déplacer le code que j'avais mis en -awakeFromNib de -viewDidLoad a résolu le problème. Semble que -awakeFromNib est appelée qu'une seule fois lors de la UIViewController est non archivée de la plume, et -viewDidLoad est appelée chaque fois que l'affichage est non archivée.

Quelle est donc la meilleure pratique? Il ressemble à UIViewController de l' -awakeFromNib ne devrait pas être l'ajout de tout point de vue à la vue, ce genre de choses devrait être fait en -viewDidLoad. Suis-je comprendre cela correctement? Ou suis-je plus confus que je ne le pensais?

63voto

Kevin Ballard Points 88866

awakeFromNib est appelé lorsque le contrôleur lui-même est désarchivé d'un nib. viewDidLoad est appelé lorsque la vue est créée / désarchivée. Cette distinction est particulièrement importante lorsque la vue du contrôleur est stockée dans un fichier NIB séparé.

24voto

Prcela Points 1736

Il est également important que la fonction awakeFromNib ne soit jamais appelée après la récupération d'un avertissement de mémoire. Mais la fonction viewDidLoad sera appelée.

12voto

Mehrdad Afshari Points 204872

Oui c'est correct. Vous ne devriez pas vraiment compter sur awakeFromNib pour faire ce genre de tâches.

awakeFromNib est similaire à un événement appelé après la désérialisation dans .NET. viewDidLoad est similaire à l'événement Load dans .NET.

Si vous connaissez les concepts de .NET, cela devrait suffire, à mon avis.

7voto

hrchen Points 395

En essayant de répondre par exemple:

Si définir CustomCell classe et CustomCell.xib fichier, puis charger la cellule à l'aide de - (NSArray *)loadNibNamed:(NSString *)nom du propriétaire:(id)options du propriétaire:(NSDictionary *)options. awakeFromNib qui est appelé lorsque les objets dans le xib sont non archivée.

Si définir une CustomViewController, puis, quand le CustomViewController est créé par l'utilisation d' - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil. viewDidLoad seront appelés quand il est chargé, en vue de la hiérarchie.

Certains sont liés à confusion méthodes:

  • (void)loadView; // C'est là que les sous-classes doivent créer leur affichage personnalisé de la hiérarchie si elles ne sont pas à l'aide d'une plume. Si vous ne spécifiez pas un nom de plume, puis loadView va tenter de charger une plume dont le nom est le même que votre point de vue du contrôleur de classe. Si aucune plume n'existe, vous devez appeler -setView: avant -view est invoquée, ou de remplacer la méthode loadView pour configurer votre point de vue par programmation. -loadView ne doit jamais être appelée directement.

  • (void)viewDidLoad; // Appelé après le point de vue a été chargé. Pour afficher les contrôleurs créé dans le code, c'est après -loadView. Pour afficher les contrôleurs non archivée à partir d'une plume, c'est après le point de vue est réglé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: