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?
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