9

Ho un'app per iOS con un UIAlertController sotto forma di un foglio di azione presentato nella mia app quando l'utente tocca un pulsante.Blocco di completamento UIAlertAction non chiamato - iOS

Tutto funziona alla grande, a parte una cosa, i blocchi di completamento non vengono richiamati per qualche motivo.

Ecco il mio codice:

// Setup the alert information/type. 
UIAlertController *action_view = [UIAlertController alertControllerWithTitle:@"Test title" message:@"test message" preferredStyle:UIAlertControllerStyleActionSheet]; 

// Create and add the cancel button. 
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Dismiss" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { 

    [action_view dismissViewControllerAnimated:YES completion:^{ 
     NSLog(@"asdhfgjk"); 
    }]; 
}]; 

// Add the action button to the alert. 
[action_view addAction:cancel]; 

// Present the alert to the user. 
[self presentViewController:action_view animated:YES completion:nil]; 

Se si esegue il codice che si vedrà la linea che respinge il controller solito correre e neppure il NSLog dichiarazione al suo interno. Tuttavia, se si elimina il NSLog e si imposta il blocco di completamento su zero, allora viene eseguito .... perché ???

Grazie per il tuo tempo, Dan.

risposta

34

Non tentare di ignorare il controller di avviso. Verrà eliminato per te nel momento in cui viene chiamato il gestore dell'azione di avviso.

cambiare l'azione "Annulla" per:

UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Dismiss" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { 
    NSLog(@"asdhfgjk"); 
}]; 
+1

Perché il voto negativo? Se c'è qualcosa di sbagliato nella risposta, almeno spiegare qual è il problema. – rmaddy

+2

Non so chi ti abbia votato, ma sto votando la tua risposta e ticchettando perché ha risolto perfettamente il mio problema, grazie. Vieni a pensarci, non so perché ho avuto l'impressione che dovrei dirlo di chiudere comunque il controllore degli avvisi. – Supertecnoboff

+0

In aumento perché mi ha aiutato e perché sono stato anche downvoted prima senza dare una motivazione. SO dovrebbe richiedere un motivo per essere dato su un downvote. – Alyoshak

2

Il "annullare" l'azione non dovrebbe respingere il controller della vista come detto da rmaddy. Tuttavia, anche se l'azione "cancella" è impostato su:

UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Dismiss" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { 
NSLog(@"asdhfgjk");}]; 

è possibile vedere lo stesso problema con il blocco di completamento non essere chiamato. Ad esempio, l'applicazione del presente metodo (alquanto artificiosa):

- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion { 
    [[self presentedViewController] dismissViewControllerAnimated:flag completion:nil]; 
} 

potrebbe anche avere questo effetto poiché l'UIAlertController viene respinto prima che il blocco completamento è chiamato.