2014-09-25 16 views
12

Sto provando a utilizzare l'iOS 8 UIAlertController al posto di dove avrei utilizzato uno UIAlertView in passato. Voglio che l'utente sia in grado di inserire del testo in questo avviso e premere "OK" per elaborare il testo o "Annulla" per annullare.UIAlertController con campo di testo - premendo il pulsante di ritorno nasconde solo la tastiera, non esegue l'azione?

Ecco il codice di base:

UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Change Value" message:@"Enter your new value."]; 
[alert addTextFieldWithConfigurationHandler:nil]; 

[alert addAction: [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 
    UITextField *textField = alert.textFields[0]; 
    NSLog(@"text was %@", textField.text); 
}]]; 

[alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { 
    NSLog(@"Cancel pressed"); 
}]]; 

[presentingVC presentViewController:alert animated:YES completion:nil]; 

Con il vecchio UIAlertView, vorrei contrassegnare con un alertViewStyle di UIAlertViewStylePlainTextInput. Quindi, se l'utente preme il pulsante "Invio" sulla tastiera dopo l'immissione del testo, il metodo UIAlertViewDelegate willDismissWithButtonIndex: viene chiamato con un numero buttonIndex (a seconda di quali tasti sono stati specificati nello UIAlertView).

Nel nuovo UIAlertController, se l'utente tocca i pulsanti "OK" o "Annulla", le azioni corrispondenti vengono eseguite come previsto; ma se l'utente preme semplicemente il tasto "Invio" sulla tastiera, nasconde semplicemente la tastiera, ma l'avviso rimane sullo schermo e non viene eseguita alcuna azione.

Ho pensato di configurazione del campo di testo per impostare il UITextFieldDelegate-self, e poi forse l'override del metodo textFieldDidReturn:, ma anche io non so se c'è un modo per chiamare una delle azioni s' il UIAlertController programmazione. E suona comunque un po 'disordinato/hacky. Mi manca qualcosa di ovvio?

+0

Non riesco a trovare un modo per attivare le azioni anche programmaticamente. Che svista ... – elsurudo

risposta

0

Provalo in iOS 8.0.2, potrebbe averlo risolto. Il mio campo di testo sta attivando l'azione "OK" predefinita senza nemmeno utilizzare alcuna delega.

+0

Non funziona nemmeno su iOS 9.2. Questa è sicuramente una svista. – elsurudo

1

Non è la risposta ideale, ma ho finito per estrarre il codice della mia azione in un metodo e semplicemente chiamando quel metodo sia dall'azione che dal metodo textFieldDidReturn: nello UITextFieldDelegate.

7

Su iOS 9.3, questo accade quando si hanno più azioni con lo stile UIAlertActionStyleDefault.

Quando si aggiunge un'azione con UIAlertActionStyleDefault e un altro con UIAlertActionStyleCancel, l'azione con stile di default saranno chiamati

0

Swift Soluzione 3:

Assicurarsi di avere una sola opzione come .default. Ho anche scoperto che lo stesso comportamento scorretto si verifica quando si utilizza un'opzione .default e una .destructive ... non si sa perché questo accada.

let cancelAction = UIAlertAction(title: "Discard", style: .cancel) { (_) -> Void in 
      self.invokedPullToAdd = false 
     } 
let submitAction = UIAlertAction(title: "Save", style: .default) { [unowned ac] _ in 
      let answer = ac.textFields![0] 
      if answer.text != "" { 
       self.addItem(name: answer.text!) 
       self.tableView.reloadData() 
      } else { 
       print ("WARNING: No input!") 
      } 
      self.invokedPullToAdd = false 
     } 
-1

Non impostare due "UIAlertActionStyleCancel" in UIAlertAction.

Problemi correlati