viewDidAppear ne fonctionne plus

yodarkyodark Membre
23:24 modifié dans API UIKit #1
Bonjour,

J'ai un petit souci... J'utilise un méthode viewDidAppear dans un de mes contrôleur de vue pour effectuer une action quand l'utilisateur clique sur un onglet spécifique de ma tab bar. Au départ ma tab bar était incluse directement dans le main windows. Mais actuellement depuis que j'ai mis ma tab bar dans une autre vue le contrôleur de vue n'exécute jamais viewDidAppear. Pourquoi ?

Réponses

  • Philippe49Philippe49 Membre
    23:24 modifié #2
    Peut-être qu'elle n'est pas passée par la phase disparue ?
    Mets un NSLog dans viewWillDisappear ?
  • yodarkyodark Membre
    23:24 modifié #3
    Je suis pas sure de te suivre la... Il faut d'abord qu'elle disparaisse avant ?
    J'ai testé avec un NSLog viewWillDisappear n'est jamais invoquée. (Par contre viewdidload est bien appelé)
  • Philippe49Philippe49 Membre
    décembre 2008 modifié #4
    dans 1230290842:

    Je suis pas sure de te suivre la... Il faut d'abord qu'elle disparaisse avant ?
    J'ai testé avec un NSLog viewWillDisappear n'est jamais invoquée. (Par contre viewdidload est bien appelé)

    Si tu attends une seconde apparition, oui.
    Si c'est pour la première apparition, non.



    Autrement la doc sur la méthode viewDidAppear est assortie d'un Warning

    viewDidAppear:
    Sent to the controller after the view fully appears and animations end.

    - (void)viewDidAppear:(BOOL)animated

    Parameters
    animated
    If YES, the appearance of the view is animated; otherwise, it is not.
    Discussion
    The default implementation of this method does nothing. Subclasses may override this method to take an appropriate action. When doing so, they must invoke super.


    Warning:
    If the view belonging to a view controller is added to a view hierarchy directly, the view controller will not receive this message. If you insert or add a view to the view hierarchy, and it has a view controller, you should send the associated view controller this message directly. Failing to send the view controller this message will prevent any associated animation from being displayed.
  • Philippe49Philippe49 Membre
    23:24 modifié #5
    Ce qui veut dire que si tu fais apparaà®tre ta vue pour la première fois, et que tu l'ajoutes directement par exemple par addSubview: les méthodes viewWillAppear et viewDidAppear ne sont appelées.
  • yodarkyodark Membre
    23:24 modifié #6
    C'est pour faire apparaà®tre la vue pour la première fois. Mais j'utilise pas de addsubview directement c'est le tabbar qui charge la vue. Au début je faisais

    window->addsubview:montabar

    pas de problèmes

    maintenant je fais
    window->addsubview:MoncontrolleurDeVue.view->addsubview:montabar

    Et donc maintenant quand je clique sur un onglet de mon tabbar j'ai pas le viewDidAppear qui se lance

    C'est la que je suis un peu perdu pour la solution. Je dois envoyer ce message au controlleur de vue du tab bar ? De quelle manière ? Surtout que que le tabbar controller est sous forme d'objet IB.
    J'ai tenté (un peu naivement)  :P de faire

    <br />- &nbsp;(void)viewDidAppear:(BOOL)animated<br />{<br />[super viewDidAppear:animated];
    

    Je vois pas vraiment comment faire
  • Philippe49Philippe49 Membre
    décembre 2008 modifié #7
    Voici un petit essai avec un projet de type Tab Bar Application.

    Notamment, il faut définir les classes des UIViewController à  la fois dans MainWindow.xib (voir image pour la hiérachie des UIViewController) et naturellement pour File's owner du xib qui sera chargé.

    Si tu fais tout cela à  la main sans le secours du template TabBar Application, il faut faire de même.
  • yodarkyodark Membre
    23:24 modifié #8
    Merci pour ton exemple ! J'ai repris ton ton code pour y inclure mon cas spécifique. J'ai ajouté une vue (SplashView) a window avant d'ajouter tabbar en sous vue.

    Du coup les viewDidLoad ne fonctionnent plus. Les sources dans le fichier attaché.
  • Philippe49Philippe49 Membre
    décembre 2008 modifié #9
    dans 1230400245:

    J'ai ajouté une vue (SplashView) a window avant d'ajouter tabbar en sous vue.

    Ce n'est pas fait pour fonctionner ainsi ... donc forcément même si cela n'est pas impossible à  faire tu rames à  contre-courant. On devrait pouvoir y arriver mais tu rames à  contre-courant.

    Dans ce template, le contenu de window est défini par un UITabBarController. ce dernier pilote un tableau de UIViewController, et selon l'onglet sélectionné présente une vue généralement configurée dans un nib spécifique correspondant à  la classe du UIViewController.


    En clair, si tu veux que ton splashView soit chargé quelque part selon ce modèle, il faut qu'il soit dans l'un des xib, associé à  l'un des UIViewController, répertoriés par le UITabBarController.
    ou alors que tu fasses une transition à  partir d'un autre écran ...

    Si tu veux "customiser" ton affichage du premier écran, la méthode à  suivre est décrite par le message de IB dans le FirstViewController :
    Optionally move this view into a separate nib file and set the nib name in the First View Controller Attributes.
    optionnally car évidemment, tu peux configurer le premier écran dans MainWindow.xib.
  • Philippe49Philippe49 Membre
    23:24 modifié #10
    Mais je suis étonné que les viewDidLoad ne soient pas appelés.

    Dans le code que je t'ai fourni , si on retire les /* */ et qu'on met
    NSLog(@first view did load);
    NSLog(@second view did load);

    on voit bien ces log
Connectez-vous ou Inscrivez-vous pour répondre.