viewDidLoad et awakeFromNib calendrier
C'est ma compréhension que awakeFromNib sera toujours appelée avant viewDidLoad.
J'ai donc une sous-classe d'un UITableViewController, qui est non archivée à partir d'un fichier xib.
J'ai défini ces deux méthodes à l'intérieur:
- (void)awakeFromNib {
[super awakeFromNib];
NSLog(@"awake from nib");
}
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"view did load");
}
ce qui se passe est que le "point de vue ne charge" s'affiche avant de "se réveiller de plume" dans la console. J'ai essayé d'utiliser un point d'arrêt à [super awakeFromNib], et à plusieurs reprises sur F7 (Étape), et à ma grande surprise, il entra dans -(void)viewDidLoad AVANT de passer à la deuxième ligne à l'intérieur de awakeFromNib.
Quelqu'un a une idée de ce qui se passe ici? J'ai fait exactement la même chose dans une sous-classe de régulièrement un UIViewController, et le journal des déclarations sont inversés, comme je l'ai initialement prévu...
OriginalL'auteur bogardon | 2011-06-10
Vous devez vous connecter pour publier un commentaire.
Comprendre ce fait, je vous recommande de voir
loadNibNamed:propriétaire:options:
méthode deNSBundle
.Lorsque vous init vue contrôleur de plume, tout d'abord, il charge les vues qui y sont contenues, elle définit ensuite les propriétaires de fichiers propriétés en fonction de la plume.
viewDidLoad
méthode est appelée lorsqu'elle met du propriétaire du fichierview
propriété à l'un des points de vue qui ont été chargés. EtawakeFromNib
est appelée lorsque tous les fichiers propriétaires de points de vente et les propriétés sont définies (y comprisview
de la propriété). Il est donc logique queviewDidLoad
est appelé plus tôt queawakeFromNib
.Espère que cela va aider à
Alors, où est le conflit avec ce que je dis? Le fait est que, lorsque l'avertissement de mémoire se produit la vue des contrôleurs de vue (si elle n'est pas visible) est mis à néant et libéré. Et quand il sera de nouveau visible-vue-contrôleur les charges de son point de vue à partir de son fichier xib et définit
self.view = viewLoadedFromXib
donc viewDidLoad est appelée de nouveau alors qu'il n'a pas de configurer de nouveau à ne pas faire appel awakeFromNib de nouveau.Si vous ne me croyez pas, ou je n'ai pas l'écrire clairement, vous pouvez consulter documentation vous-même. De toute façon, il sera plus divers.
De vous concentrer sur quelque chose de mal, la mémoire, l'avertissement n'était pas ce que j'avais l'intention de vous regarder. De toute façon, voir mon édité réponse.
OriginalL'auteur Zapko
Je ne pense pas que vous devez appeler awakeFromNib sur votre super classe.
Vérifier cette.
Modifier
J'ai juste couru un test rapide, voici les résultats:
Scénario 1:
MainWindow.Xib a une sous-classe UIViewController
TestingAwakeFromNibViewController
, Qui a sa propre Plume fichierTestingAwakeFromNibViewController.xib
.TestingAwakeFromNibViewController a un UIButton Prise appelée btn3.
Tester le code suivant :
Serait D'Impression:
Scénario 2:
En supprimant le fichier xib, l'ajout d'une UIView comme un fils de la TestingAwakeFromNibViewController à l'intérieur de MainWindow.Xib, et l'ajout de UIButton comme une sous-vue de la UIView (et le raccordement de l'UIbutton prise à la prise appropriée de TestingAwakeFromNibViewController).
Maintenant en cours d'exécution le code ci-dessus affichera:
Sens ViewDidLoad avant AwakeFromNib.
Troisième Scénario:
Même que le second, juste sans appel
[super awakeFromNib];
Maintenant ViewDidLoad n'est même pas appelé.
Donc, il semble que les différents scénarios sont à l'appel pour une action différente, et nous devons nous préparer en fonction de celui que nous agissons.
OriginalL'auteur Idan
J'ai créer un projet de test avec système de Navigation basé sur option de l'Application et ajouter des codes suivants pour rootViewController.m.
Ensuite, j'ai obtenu les résultats à partir de la console:
La
-(void)viewDidLoad
sera appelé lors de l'affichage de contrôleur est chargé. Ainsi, lorsque la première fois que vous utilisezself.view = ...
, le-(void)viewDidLoad
sera invoquer.Si vous avez écrit quelque chose comme suit, puis -(void)viewDidLoad sera appelé en premier.
OriginalL'auteur AechoLiu
Sans être un expert, et à la suite de ce messages, je me rends compte que dans un Onglet Contrôleur de scénario, Dans "l'enfant" - vue-contrôleur, le awakeFromNib méthode est exécutée lors de l'onglet contrôleur (parent) est chargé, mais viewDidLoad seulement lorsque son "Tab" est cliqué.
Et, par conséquent, je comprends que cela peut être utilisé pour charger les données uniquement lorsqu'un onglet est sélectionné (cliqué)
OriginalL'auteur Albert Català