2009-07-21 4 views
1

J'ai une vue quelque peu complexe que j'ai rassemblée dans un projet distinct (View-based template) (le View Controller était représenté avec une icône orange dans MainWindow.xib). C'est assez loin maintenant que j'ai décidé de le déplacer dans un autre projet où il sera géré par un contrôleur de navigation. Il est appelé à partir de la méthode de UINavigationController: straightViewController: animated:.Déplacé mon viewController sous un NavController et maintenant awakeFromNib et initWithCoder ne se déclenchent pas?

MyViewController a un fichier nib correspondant (peut-être une partie de ma confusion est la pointe de classe & sont presque identique avec le nom que .m suffixes, .h, & .xib étant différent). Lorsque c'était la vue initiale au lancement dans le projet initial à la fois awakeFromNib et initWithCoder serait appelé quand il a été instancié. Maintenant seulement viewDidLoad semble être appelé.

Je suis confus quant à quoi/pourquoi il y a une telle différence?!? J'ai trouvé d'autres sujets sur S.O. qui sont liés mais ils me laissent toujours me gratter la tête avec des réponses comme: "awakeFromNib is called when the controller itself is unarchived from a nib. viewDidLoad is called when the view is created/unarchived. This distinction is especially important when the controller's view is stored in a separate nib file."

La distinction semble dépendre de ce que, exacty, est désarchivée la vue ou le ViewController. Donc, si le ViewController est instancié et poussé alors je devrais seulement attendre que viewDidLoad soit appelé? et d'un autre côté, si mon ViewController a une IBOutlet (et un objet VC d'objet le représentant qui a été déplacé dans mon Nib) alors je peux m'attendre à ce que initWithCoder et awakeFromNib soient tous les deux appelés?

Est-ce que quelqu'un peut m'aider s'il vous plaît? On dirait qu'il est plus difficile de réutiliser ces vues/contrôleurs si différentes méthodes sont arbitrairement appelées dans des circonstances très spécifiques ... ou, comme c'est certainement le cas, c'est exactement pourquoi elles sont appelées, plutôt, des circonstances très spécifiques. Je ne comprends pas tout à fait la délimitation entre chacune des différentes méthodes pour le moment.

Quelqu'un veut-il m'aider à me redresser?

Répondre

2

La distinction semble dépendre de ce que , exacty, est désarchivée la vue ou la ViewController. Donc si le ViewController est instancié et poussé alors je devrais attendre seulement que viewDidLoad soit appelé? et d'autre part si mon ViewController a un IBOutlet (et un objet VC objet représenter que a été traîné dans mon Nib) alors je peux attendre initWithCoder et awakeFromNib à la fois appelée?

C'est là que vous vous égarez. Ce n'est pas si le ViewController a ou non un IBOutlet. C'est si le ViewController est ou non instancié dans une NIB qui détermine si -awakeFromNIB est appelée.

D'après votre description, je prends quelque part dans votre code que vous avez quelque chose comme ceci:

MyViewController *vc = [[MyViewController alloc] init]; // (or initWithNibName:bundle:) 
[navController pushViewController:vc animated:YES]; 
[vc release]; 

Si oui, alors la BNI n'instancié MyViewController.Votre code est. Comme si -awakeFromNib ne va pas être appelé. Vous n'êtes pas réveillé d'un NIB. Ce que vous avez peut-être voulu faire est d'étendre le contrôleur de navigation dans votre NIB (passer à la vue de liste, le bouton du milieu dans le jeu de boutons de mode Affichage dans le coin supérieur gauche). Là, vous verrez le contrôleur de vue racine. Par défaut, c'est un UIViewController. Si vous voulez que le contrôleur racine soit MyViewController, vous devez changer sa classe. Dans ce cas, vous obtiendrez un appel -awakeFromNib parce que ce serait le NIB qui a créé cet objet. Vous devriez alors bien sûr vous débarrasser de tout code qui l'instancie et le place sur le NavController.

+0

En réalité, elle est appelée par: MyViewController * myViewController = [[MyViewController alloc] initWithNibName: @ "MyViewController": nil]; bien que ce que vous dites ait du sens ... mais je me demande si c'est encore applicable dans mon cas? – Meltemi

+0

Oui, c'est exactement la même chose. Notez le commentaire dans la première ligne de code ci-dessus. initWithNibName: bundle: est la même chose dans ce cas que init. –

+0

En effet ... merci de souligner que je n'ai pas fait défiler à droite .. – Meltemi

Questions connexes