2015-01-21 7 views
8

Ho provato a chiudere un UIViewController dopo che è stato mostrato uno UIAlertController.dismissViewControllerAnimated non funziona all'interno di un blocco

Questo è il mio codice:

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title 
                     message:msg 
                    preferredStyle:UIAlertControllerStyleAlert]; 
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"Accept" 
                style:UIAlertActionStyleDefault 
               handler:^(UIAlertAction *action) 
      { 
       [self dismissViewControllerAnimated:YES completion:nil]; 
      }]; 

[alertController addAction:okAction]; 
[self presentViewController:alertController animated:YES completion:^{}]; 

Tuttavia, self non viene mai respinto. Qualcuno sa come risolvere questo?

UPDATE

se ho impostato [self dismissViewControllerAnimated:YES completion:nil]; al di fuori del blocco, funziona.

risposta

5

Nel caso in cui qualcuno sta avendo lo stesso problema. Ho spinto il UIViewController, non l'ho presentato con presentViewController:animated:completion:. Questo è il motivo per cui è necessario utilizzare [self.navigationController popViewControllerAnimated:YES];.

La cosa strana è che [self dismissViewControllerAnimated:YES completion:nil]; lavorato fuori del blocco e non ha dentro, non ho alcuna spiegazione per questo ...

3

[self dismissViewControllerAnimated:YES completion:nil] chiuderà qualsiasi controller di vista che il attualmente visualizzazione vista (cioè "self") è visualizzato. Quello che vuoi fare è eseguire lo stesso metodo su presentando il controller di visualizzazione per "self". Cioè

[self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; 
+0

ma auto (l'UIViewController corrente) è la vista Voglio licenziare. Ho provato ad aggiungere .parentViewController, non fa differenza. – Daniel

+0

Sì, esattamente. Vuoi licenziare "te stesso". "self.presentingViewController" potrebbe farlo. Aggiornamento della risposta. –

+0

non funziona o – Daniel

2

Avete controllato su quale thread è stato richiamato il blocco? Se non è il thread 1, quindi non eliminerà la visualizzazione correttamente, poiché la manipolazione dell'interfaccia utente può essere eseguita solo sul thread uno. Prova a creare un metodo per respingere e quindi chiamando sul thread principale:

...handler { 
    [self performSelectorOnMainThread:@selector(dismissModalView) withObject:nil waitUntilDone:NO]; 
}]; 

-(void)dismissModalView { 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 
+0

sì, l'ho provato, non ha funzionato. A proposito, il selettore più corto è 'performSelectorOnMainThread: withObject: waitUntilDone:' – Daniel

+0

grazie, codice modificato con il metodo completo. – Bek

+0

grazie Bek, sta funzionando. –

8

Basta usare [super.navigationController popViewControllerAnimated:YES];