2010-08-10 26 views
0

J'ai un iPhone3G avec activant cette fonction dans mon ViewControllerviewDidAppear, mais où est viewDidShowToUser?

- (void)viewDidAppear:(BOOL)animated { 

[super viewDidLoad]; 

} 

J'utilise une application iphone TabBar. Mais quand je clique de l'onglet 1 à l'onglet 2 et débogue le secondView Controller il est arrêté avant que la vue soit réellement dans la vue d'utilisateurs.

Donc là pour quand vous cliquez sur l'onglet 2 jusqu'à ce que chaque fonction à l'intérieur - (void) viewDidAppear: (BOOL) animée est terminée, l'utilisateur peut voir la vue.

Où est la fonction ViewDidShowToUser? Maintenant, j'ai quelques fonctions en cours d'exécution il est donc parfois lent et vous pensez le bouton ne fonctionne pas vraiment ..

Répondre

1

vous appelez super sur viewDidLoad: à l'intérieur de viewDidAppear: .... changer la ligne [super viewDidLoad];-[super viewDidAppear:animated];

+0

Merci les gars. Yourright mais le problème est également à l'intérieur de IB.Couse: Lorsque je débogue mon application. Il déclenche ViewDidLoad First après cellForRowAtIndexPath .... Je pense que couse du propriétaire des fichiers est un ViewController et a ajouté les protocoles de délégué et de source de données. Dans mon autre application viewDidload a été déclenché après le chemin cellForRowAtIndex qui est mon autre application était un TableViewController ... Mais à ce moment ma vue est un peu plus complexe, donc j'utilise une petite tableView dans la vue .. Ok je vais essayer l'option 2. Merci –

4

tout d'abord, vous appelez [super viewDidLoad] au lieu de [super viewDidAppear:animated] dans votre mise en œuvre de -viewDidAppear:

en second lieu, en utilisant le débogueur et points d'arrêt donne une vue artificielle de la façon dont votre application se comporte. En utilisation réelle, les utilisateurs ne remarqueront pas que la méthode -viewDidAppear: retourne avant d'afficher la vue.

Le vrai problème est votre travail qui prend trop de temps à terminer et rend l'application semble léthargique. Vous devriez envisager d'effectuer le travail de façon asynchrone, et vous avez quelques options pour le faire.

  1. Dans votre implémentation viewDidAppear: vous pouvez utiliser performSelector:withObject:afterDelay: faire la queue le travail. Cette méthode retournera immédiatement et planifiera votre sélecteur à appeler quelle que soit la période spécifiée. Si vous transmettez 0 en tant que délai, il sera mis en file d'attente pour s'exécuter à la prochaine itération de la boucle d'exécution, vous permettant ainsi de revenir de la méthode et de garder l'interface utilisateur réactive. Vous pouvez utiliser des blocs, si vous ne ciblez rien d'autre que iOS4, et exploitez la puissance de Grand Central Dispatch pour effectuer votre travail de manière agréable et en toute sécurité.

0

Il n'y a pas de moyen facile de le dire.

UIKit rend UIViews. UIViews dessine à CALayers. CALayers sont gérés par CoreAnimation. CoreAnimation décide quand demander à UIView de dessiner les couches. Il dessine toutes les couches à l'écran et les compose ensuite sur le GPU. Ce n'est qu'après leur composition que l'écran affiche l'interface utilisateur mise à jour. Ce découplage se produit afin de permettre à CoreAnimation de faire la majorité du travail indépendamment du thread d'interface utilisateur, mais cela signifie que vous ne pouvez pas facilement dire ce qui est "réellement à l'écran".

Il n'y a pas de moyen facile de savoir quand l'écran a réellement affiché quelque chose (à l'exception de l'UIGetScreenImage() maintenant privé). viewDidAppear: est appelé après que UIKit ait fini de construire (et d'animer) les vues/couches. À ce stade, ils seront "vus" par CoreAnimation après la prochaine boucle d'exécution, et affichés peu de temps après. Si vous effectuez beaucoup de traitement dans viewDidAppear :, CoreAnimation ne verra jamais l'arborescence du modèle mise à jour.