cancelPreviousPerformRequestsWithTarget n'annulant pas un performSelector en attente: withDelay
Je suis à l'aide d'un UIWebView
et ne veulent pas la barre de navigation à apparaître, à moins que l'utilisateur appuie n'importe où sur l'écran qui n'est pas un lien.
J'ai donc ce code pour afficher la barre de navigation après un délai:
- (void)handleTapGesture:(UITapGestureRecognizer *)sender
{
....
[self performSelector:@selector(showNavigationBar) withObject:self afterDelay:0.2];
}
Je ne suis pas d'appel showNavigationBar
immédiatement lorsque le robinet gestionnaire est appelé, car l'utilisateur pourrait avoir tapé sur un lien dans lequel cas le robinet virage est appelé avant UIWebView
shouldStartLoadWithRequest
donc si j'ai caché la barre de navigation dans shouldStartLoadWithRequest
il clignote brièvement sur l'écran.
Donc à la place je l'ai mis à l'écran après un délai qui donne le temps pour le code suivant à exécuter dans shouldStartLoadWithRequest
(et si l'utilisateur n'a pas de taper sur un lien shouldStartLoadWithRequest
n'est pas appelé et la barre de navigation est affiché, comme il devrait être dans ce cas).
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showNavigationBar) object:nil];
...
Toutefois, cela ne fonctionne pas, j'ai augmenté le temps de retard de plusieurs secondes et peut confirmer cancelPreviousPerformRequestWithTarget
est appelé avant de la barre de navigation s'affiche, mais lorsque le temps spécifié est écoulé, la barre s'affiche. cancelPreviousPerformRequestWithTarget
est ne pas avoir d'effet.
Quelqu'un sait pourquoi sa ne fonctionne pas?
source d'informationauteur Gruntcakes
Vous devez vous connecter pour publier un commentaire.
Dans le la documentation de
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(id)anArgument
méthode il y a cette phrase :Si je suis de les interpréter correctement, il signifie que vous devez annuler votre action dans la même boucle que vous avez lancé. Qui n'est clairement pas ce que vous voulez faire.
Un moyen de faire le tour, ce serait d'avoir un drapeau qui
showNavigationBar
faudrait vérifier pour voir si elle doit continuer ou abandonner.Votre effectuer ne correspond pas à votre annuler. Dans l'effectuer vous êtes de passage à soi-même comme l'objet:
Dans l'annuler vous êtes de passage néant l'objet:
Elles ne correspondent pas, de sorte que le retard effectuer ne doit pas être annulée.
Qui a fonctionné pour moi 😉