0

J'ai une sous-classe UIViewController appelée NewsViewController qui possède une propriété de bloc d'achèvement appelée à partir d'une action de bouton. Le contrôleur est mis en place et présenté dans un autre contrôleur de vue comme celui-ci:dismissViewControllerAnimated ne fonctionne pas dans iOS 9

newsViewController.completionBlock = ^{ 
    [self dismissViewControllerAnimated:YES completion:nil]; 
}; 

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:newsViewController]; 
[self presentViewController:navigationController animated:YES completion:nil]; 

Dans iOS 10 tout cela fonctionne très bien, mais dans iOS 9 la vue n'est pas rejetée. Si je mets un point d'arrêt là, il est touché.

J'ai essayé ce qui suit sans succès:

Appelée depuis le thread principal (à la fois synchrone et asynchrone)

Je l'ai essayé en utilisant GCD comme ceci:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self dismissViewControllerAnimated:YES completion:nil]; 
}); 

Je l'ai également essayé en mettant l'appel de licenciement dans une méthode puis en appelant

[self performSelectorOnMainThread:@selector(dismissModalView) withObject:nil waitUntilDone:NO]; 

Je ne pense pas que le problème est le fil de discussion car un appel à [NSThread isMainThread] à partir du bloc d'achèvement renvoie YES.

appel avec un retard

[self performSelector:@selector(dismissModalView) withObject:nil afterDelay:0.1]; 

appel sur un autre contrôleur rejette vue

Je l'ai essayé d'appeler sur navigationController, self.presentedViewController et self.presentingViewController.

appel directement à partir NewsViewController rejeter

Dans l'action du bouton où le bloc d'achèvement a été appelé, j'ai appelé [self dismissViewControllerAnimated:YES completion:nil] directement.

Btw. juste pour le plaisir, j'ai essayé d'appeler la méthode de rejet du bloc d'achèvement de la méthode presentViewController et là, il a été rejeté.

Répondre

0

J'ai enfin trouvé le problème et il était tout à fait inattendu. Le truc, c'est que le NewsViewController est présenté sur mon contrôleur de connexion. Ce contrôleur permet à l'utilisateur d'utiliser Touch ID pour se connecter afin qu'il demande l'invite Touch ID dans sa méthode viewDidAppear. Apparemment, cela salit avec le rejet de la vue présentée, et apparemment seulement dans iOS 9 (bien, peut-être pas seulement, mais il semble bien fonctionner dans iOS 10).

0

Essayez avec le code ci-dessous:

newsViewController.completionBlock = ^{ 
    [self performSelector:@selector(Dismiss) withObject:nil afterDelay:0.3]; 
}; 

-(void)Dismiss 
{ 
[self dismissViewControllerAnimated:YES completion:^{ 

    }]; 
} 
+0

Je ne suis pas sûr de ce que j'accomplirais avec ceci. En utilisant votre code, je présenterais le 'NewsViewController' après l'avoir rejeté. Ce n'est pas ce que je veux du tout et ça ne résoudrait pas mon problème de toute façon (ne pas pouvoir rejeter en premier lieu). – pajevic

+0

Vous devez le rejeter à la fin, puis écrivez uniquement sans rien dans le bloc d'achèvement. –

+0

Votre code me donnerait un cycle infini. Dans le bloc d'achèvement, vous présentez à nouveau le même contrôleur de vue. Donc, quand la vue est rejetée, elle sera présentée à nouveau. – pajevic