web-dev-qa-db-fra.com

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

J'ai récemment eu un problème dans mon application où certaines des vues secondaires que je créais dans la méthode -awakeFromNib d'une sous-classe UIViewController disparaissaient de la vue. Après quelques fouilles, je me suis rendu compte que le fait de déplacer le code que j'avais mis dans -awakeFromNib vers -viewDidLoad résolvait le problème. Il semble que -awakeFromNib ne soit appelé qu'une fois lorsque UIViewController est désarchivé du nib, et -viewDidLoad est appelé chaque fois que la vue est désarchivée.

Alors, quelle est la meilleure pratique? Il semblerait que -awakeFromNib d'UIViewController ne devrait pas ajouter de vues à la vue, ce genre de choses devrait être fait dans -viewDidLoad. Est-ce que je comprends bien? Ou suis-je plus confus que je ne le pensais?

53
Mike Akers

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

63
Lily Ballard

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.

24
Prcela

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.

12
Mehrdad Afshari

Je vais essayer de répondre en donnant un exemple:

Si vous définissez la classe customCell et le fichier customCell.xib, puis chargez la cellule en utilisant
- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options, awakeFromNib est appelé lorsque les objets de la bibliothèque xib sont désarchivés. 

Si vous définissez une customViewController, alors lorsque la customViewController est créée à l'aide de - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil. viewDidLoad sera appelé lorsqu'il sera chargé dans la hiérarchie des vues.

Quelques méthodes déroutantes liées:

  • (void) loadView; C'est là que les sous-classes doivent créer leur hiérarchie de vues personnalisée si elles n'utilisent pas de nib. Si vous ne spécifiez pas un nom de nib, loadView tentera de charger un nib dont le nom est identique à celui de la classe de votre contrôleur de vue. Si ce type de fichier n'existe pas, vous devez soit appeler -setView: avant que -view soit invoqué, soit remplacer la méthode -loadView pour configurer vos vues par programme. -loadView ne devrait jamais être appelé directement.

  • (void) viewDidLoad: Appelé après le chargement de la vue. Pour viewControllers créé dans le code, il s'agit de after -loadView. Pour les contrôleurs de vue non archivés d'un nib, cela se produit une fois la vue définie.

7
hrchen

Pour un ViewController, les IBOutlets sont disponibles dans viewDidLoad ()

Ici, stackView représente un IBOutlet dans un ViewController, stackView est nul dans awakeFromNib, mais il a été instancié lors de l'appel de viewDidLoad (). 

 IBOutlets state in awakeFromNib() vs IBOutlet state in viewDidLoad()

0
andreskwan