7
votes

Méthode ViewDiDload dans UIViewController - Quand est-ce que cela est appelé?

J'ai un uiviewcontroller cod> appelé launkController lancé dans mon iPhone APP lorsque l'application ouvre d'abord:

- (void)viewDidLoad
{
    NSLog(@"calling view did load");
    [super viewDidLoad];

    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    [self.view addSubview:imageView];
    NSLog(@"displaying main controller");
}


9 commentaires

MainController a-t-il une méthode loadview mise en œuvre?


Non, qu'est-ce qu'il devrait aller dans loadview?


Vous ne le vérifiez pas si la nouvelle vue a été initiée. Déplacez NSLOG dans les SI-SWORCKETS pour voir si la vue a été initiée.


Oui, c'était inité. Je l'ai déplacé et je l'imprime toujours.


Avez-vous une NIB nommée MainController.xib dans votre projet? Si vous ne le faites pas, vous devez remplacer -LoardView et fournir une vue vide.


Connecté, si vous n'utilisez pas de NIBS: Stackoverflow.com/Questtions/8876212/...


Ce lien ne fournit pas de réponse, juste un autre problème. et @jasoncoco, non je n'ai pas de nib. Comment puis-je écraser LoadView de telle sorte que ViewDidLoad sera appelé


Je ne suis pas sûr que ce soit votre problème, mais vous pouvez simplement remplacer -charloadview et créer une vue et l'affecter à self.view . Utilisez-vous des storyboards?


Je ne suis pas sûr. Qu'est-ce qu'un storyboard?


3 Réponses :


3
votes

Vous ne logeez pas votre contrôleur d'affichage à partir d'un fichier XIB et de commentaires que vous n'avez rien dans LoadView (ce qui permet de créer votre affichage de votre contrôleur de vue si vous n'utilisiez pas de fichier XIB).

Par conséquent, votre point de vue n'est pas chargé, il n'est donc jamais appelé que ViewDidLoad n'est jamais appelé.

Généralement, vous utiliseriez initwithnibname: pour initialiser un nouveau contrôleur d'affichage, puis définissez l'image une fois qu'elle (si, exposez l'image en tant que propriété).

ViewDiDload sera appelé dès que la propriété Afficher votre contrôleur est accessible, c'est-à-dire lorsque vous l'affichez pour la première fois ou demandez-la (par exemple, avoir un code qui appelle C.View .


2 commentaires

mais je n'utilise pas xib ou initwithnib


Cela aurait été des informations utiles pour inclure dans votre question.



0
votes

La raison ViewDidDidLoad n'a pas été appelée est parce que vous ne logeez pas de vue.

dans votre méthode init: xxx

signifie que vous ne faites que créer un vue nue de zéro. Ne pas le chargement d'une nib.

Essayez cela à la place: xxx

Si vous avez un fichier XIB ou NIB avec le même nom que la classe de contrôleur d'affichage Il devrait trouver si. Sinon, vous pouvez simplement donner un nibname qui fonctionne.

mise à jour:

Si vous n'utilisez pas de fichiers NIB, la méthode appropriée n'est pas vueDidLoad. Vous devez implémenter loadview au lieu de ViewDidLoad .

Dans votre cas spécifique, il suffit de mettre tout ce qui est actuellement dans la vue ViewDidLoad dans LoadView.


2 commentaires

Mais je n'utilise pas de nib, je veux créer la vue programmatique.


mis à jour. Lisez la documentation pour UIViewController pour plus de détails sur LoadView.



4
votes

Je pense que c'est quelque chose comme des suivantes. Lorsque vous avez besoin de la propriété de View code> Inside UIViewController, il sera chargé de manière paresseuse.

- (UIView *)view 
{
   if (_view == nil) {
      [self loadView]; //< or, the view is loaded from xib, or something else.
      [self viewDidLoad];
   }

   return _view;
} 


2 commentaires

S'il vous plaît ne faites pas cela. Documentation Apple indique spécifiquement que LockView et ViewDidLoad ne doivent pas être appelés directement. De loadview : "Vous ne devez jamais appeler cette méthode directement."


@amattn: Vous avez raison. Mais je viens d'utiliser des codes ci-dessus pour décrire lorsque le -ViewDidIdload appelé.