2015-09-23 18 views
5

ho una strana bug visivo che colpisce solo iOS 9 dispositivi:iOS 9 - Tastiera apre dopo UIAlertView respinto

login di mia app UIViewController scappa e ottiene un token OAuth quando si preme il pulsante, proprio come si' d aspettarsi. Se la risposta della mia API restituisce un codice di stato specifico, faccio apparire uno UIAlertView dicendo che è necessario reimpostare la password (questo è se sono stati contrassegnati come tali sul lato server). I campi email e password per il login resignFirstResponder una volta premuto il pulsante, roba standard.

Solo su iOS 9, se si preme il percorso di ripristino, il secondo si tocca OK in quella vista di avviso, la tastiera si apre di nuovo, per forse 800 ms, quindi si chiude nuovamente. È quasi come se fosse stato messo in coda qualcosa per presentarlo, ma la presenza dell'avviso lo ha bloccato fino a quando non hai premuto OK - è assolutamente istantaneo dopo aver colpito correttamente l'avviso.

Sembra molto difficile eseguire il debug. Ho aggiunto punti di interruzione simbolici a becomeFirstResponder e non è stato chiamato da nessuna parte in prossimità di questo processo.

Altre idee su come è possibile eseguire il debug/risolvere questo problema? Non ha effetto su iOS 7 e iOS 8, solo iOS 9.

risposta

13

Ho affrontato questo problema circa 30 minuti fa.

UIAlertView è stato deprecato da quando è stato rilasciato iOS9.

Abbiamo risolto questo problema utilizzando l'UIAlertController, in questo modo:

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Alert Title!" message:@"This is an alert message." preferredStyle:UIAlertControllerStyleAlert]; 

    UIAlertAction* ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]; 
    [alertController addAction:ok]; 

    [self presentViewController:alertController animated:NO completion:nil]; 

Questo dovrebbe risolvere il problema.

Se animato = SÌ, è possibile che si verifichi lo stesso problema di prima. Questo è un bug con iOS9.

Fammi sapere come va e se questo risolve il tuo problema.

+2

prega di notare che UIAlertController disponibili solo dopo iOS 8. Se il tuo obiettivo include iOS 7 utenti, maneggiarlo con cura. – Summer

+0

Questo è molto vero. – cmart

+0

GRAZIE! Ho risparmiato le mie ore di sbattere la testa contro il muro –

0

Qui è un'estensione per gestire questo in rapida 3

extension UIViewController { 

    func presentOk(with title: String, and message: String, handler: ((UIAlertAction) -> Void)?) { 

     let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert) 

     alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: handler)) 

     OperationQueue.main.addOperation { 
      self.view.endEditing(true) 
      self.present(alert, animated: true, completion: nil) 
     } 
    } 
} 

La chiave è quello di nascondere la tastiera e presenta al controllore nella coda principale.

Uso

presentOk(with: "My app title", and: "this is the alert message", handler: nil)