6
votes

ViewDididappear a appelé deux fois à iOS5

Je développe une application avec un UinavigatorController. J'utilise la méthode viewDidAppear dans la deuxième vue de vue poussée pour trouver des informations sur un serveur externe.

Eh bien. Bien que dans l'IOS5 ait fonctionné bien au début, j'ai réalisé que ViewDididAppear n'était pas appelé dans iOS4.3, donc je mets ce code dans la racine: xxx

par la suite, l'application a commencé. travailler correctement dans iOS4.3. Cependant, dans l'IOS5, n'a pas été parce que cela a appelé deux fois viewDidAppear (celui qui a été appelé au début et celui du NavigationController: DidshowviewController: animé: )

Que dois-je faire seulement appelé une fois ViewDididAppear?

Merci beaucoup


4 commentaires

Vous devriez probablement juste réparer le problème sous-jacent. Faites-vous quelque chose d'inhabituel lorsque vous appuyez sur le contrôleur d'affichage?


Pas de Firoze, j'ai tout essayé, mais ViewDididAppear et Viewwillappear ne sont pas appelés dans une zone de vue de la navigationController. J'ai un uitabviewController et une uoinavigationController à l'intérieur de la première onglet qui charge plusieurs ViewControlers


Pour être honnête, chaque fois que j'ai vu un projet dans lequel ces méthodes de cycle de vie n'étaient pas fiables, c'était à cause des erreurs courantes dans la structure ou la présentation du contrôleur de conteneur. Avoir quelqu'un regarder ce code. Je suis sûr que vous pouvez le faire fonctionner de manière cohérente dans iOS4 sans hacks drôles.


Attendez, es-tu dites que vous avez un autre uitabbarcontroller à l'intérieur du premier onglet de autre uitabbarcontroller ?


5 Réponses :


1
votes

Vérifiez quelle version de l'utilisateur iOS l'utilisateur utilise [[Uidevice CurrentDevice] SystemVersion]; Et au cas où il est 4.3, appelez la méthode ViewDidAppear.


3 commentaires

N'est-ce pas un peu sale? Je sais que je pourrais le résoudre de cette façon, mais je pense qu'il devrait y avoir quelque chose de plus correct.


@Ibaivi - Parfois, il faut juste faire ces choses.


Au lieu de vérifier la version à l'aide de SystemVersion , une meilleure vérification de l'existence d'une classe ou d'une classe répondant à un sélecteur ajouté sur le système d'exploitation que vous souhaitez cibler.



-1
votes

Vous ne devez pas appeler viewDidAppear: manuellement, laissez-le jusqu'à uikit pour l'appeler pour vous. Si vous supprimez l'appel manuel, il ne faut appeler qu'une seule fois.


1 commentaires

Et il appelait juste une fois dans iOS5, mais si je fais de cette façon, ViewDididAppear ne sera pas appelé dans iOS4.3 ...



0
votes

S'il est appelé deux fois et que vous n'aviez capable de faire appel à l'appel que lorsque vous avez ajouté le code à la navigation racine, pourquoi ne pas supprimer le code de la vueDidAppear (le premier que vous avez créé qui a fonctionné sur iOS5) et ne laissez que le celui qui a travaillé dans les 4,3 et 5?


0 commentaires

4
votes

La seule solution réelle que je vois (ou plutôt sûr de la solution de contournement pour iOS 4.x) si vous définissez une sorte d'état dans votre avis de viewwillappear et vérifiez si elle a été définie ou non dans les appels ultérieurs, par exemple

-(void)viewWillAppear:(BOOL)animated {
    if (!viewWillAppearCalled) {
        viewWillAppearCalled = YES;

        /* do stuff */
    }
}


0 commentaires

2
votes

Vous avez probablement un autre problème (pourquoi le point de vue de la vue n'est pas appelé iOS 4).

Cependant, j'ai rencontré l'incohérence entre iOS 5 et iOS 4 à cet égard, car j'ai utilisé un contrôleur de vue de conteneur personnalisé. (ni UinavigationController ni uitabbarcontroller). La correction de la rétablissement de la restauration de la compatibilité IOS 4 consistait à mettre en œuvre la méthode suivante dans le contrôleur de vue du conteneur: xxx


0 commentaires