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é.
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
Vous devez le rejeter à la fin, puis écrivez uniquement sans rien dans le bloc d'achèvement. –
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