2009-08-08 7 views
0

J'ai un UINavigationController sur lequel je pousse un UIViewController de 'chargement de l'écran' pendant que je me connecte de manière asynchrone à un serveur. La poussée est implicitement animée de cet effet de glissement. Si une erreur survient lors de la connexion, j'ouvre le contrôleur de l'écran de chargement (encore animé) et affiche une alerte à l'utilisateur.Comment terminer une animation plus tôt dans Cocoa Touch?

Tout est bon si j'ouvre le contrôleur de vue après que l'animation soit terminée, cependant si l'animation doit encore se terminer des choses étranges se produisent. En général, l'affichage de l'écran de chargement reste à l'écran même s'il a été retiré de la pile des contrôleurs de navigation. Je suis assez sûr que le problème a à voir avec l'animation en cours. Par exemple cet extrait de code artificiel laisse toujours le point de vue de secondController à l'écran pour moi:

[navController pushViewController: secondController animated: YES]; 
[navController popToRootViewControllerAnimated: YES]; 
NSAssert([delegate.navigationController.viewControllers count] == 1, @"oops"); 

Ma solution actuelle est d'enregistrer un délégué avec le contrôleur de navigation et mettre en œuvre la NavigationController: didShowViewController: Méthode: animation. Je ne fais alors apparaître le contrôleur d'écran de chargement que lorsque la première animation poussée est terminée. Cependant, je préférerais juste terminer l'animation tôt.

J'ai essayé d'appeler removeAllAnimations sur tous les calques dans l'arborescence des calques pour toutes les sous-vues de la vue du contrôleur de navigation. Alors que cette approche terminait l'animation au début, il restait souvent l'affichage de l'écran de chargement toujours affiché après son ouverture. Donc, fondamentalement, y a-t-il une façon correcte de terminer une animation plus tôt, ou devrais-je simplement m'en tenir à mon travail?

Répondre

0

Il est difficile de savoir pourquoi vous voudriez apparaître au contrôleur de vue racine immédiatement après l'avoir poussé, mais quand j'ai dû faire ce genre de chose, je laisse le contrôleur de vue être poussé pour déterminer s'il doit ou pas. Donc, dans -viewDidLoad de votre secondController, déterminez si votre condition pour passer à la vue racine est vraie ou non. Si elle est, puis pop de là en appelant

[[self navigationController] popViewControllerAnimated:YES]; 

En outre, pas que cela va résoudre votre problème, mais vous voudrez peut-être envisager de pousser un « écran de chargement » avec -presentModalViewController à la place:

- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated 

et son équivalent pop:

- (void)dismissModalViewControllerAnimated:(BOOL)animated 
+0

Merci pour la solution de contournement suggérée Matt! La raison pour laquelle il peut potentiellement apparaître avant l'achèvement est due à la réception d'un rappel de «connexion échec» presque immédiatement après la tentative de connexion (peut-être en raison de l'appareil en mode avion, etc). Je pousse l'écran de chargement, je me connecte puis j'attends le résultat de la tentative de connexion. Si je pouvais terminer l'animation immédiatement dans ce rappel, cela économiserait un peu d'état supplémentaire et simplifierait un peu le code :) – dbotha

0

complètement non testé, mais avez-vous essayé d'enlever toutes les animations de la couche d'animation de base de la vue de vos contrôleurs de vue?

[[[secondController view] layer] removeAllAnimations]; 
Questions connexes