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?
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é.
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.
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.
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.