2014-09-25 6 views
12

Ich versuche, die iOS 8 UIAlertController anstelle von wo ich eine UIAlertView in der Vergangenheit verwendet haben würde. Ich möchte, dass der Benutzer Text in diesen Alarm eingeben kann und drücken Sie "OK", um den Text zu bearbeiten, oder "Abbrechen", um abzubrechen.UIAlertController mit Textfeld - Drücken der Return-Taste nur versteckt Tastatur, führt keine Aktion?

Hier ist der Grundcode:

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]; 

Mit dem alten UIAlertView, ich habe es mit einem alertViewStyle von UIAlertViewStylePlainTextInput markieren würde. Wenn der Benutzer dann nach der Texteingabe die "Return" -Schaltfläche auf seiner Tastatur drückt, würde die UIAlertViewDelegate-Methode willDismissWithButtonIndex: mit einigen buttonIndex aufgerufen werden (abhängig davon, welche Schaltflächen in der UIAlertView angegeben wurden).

Im neuen UIAlertController, wenn der Benutzer die „OK“ oder „Abbrechen“ Tasten tippt, dann werden die entsprechenden Aktionen wie erwartet durchgeführt werden; Wenn der Benutzer jedoch nur die "Return" -Taste auf der Tastatur drückt, wird nur die Tastatur ausgeblendet, aber die Warnung bleibt auf dem Bildschirm und es wird keine Aktion ausgeführt.

Ich habe darüber nachgedacht, das Textfeld den UITextFieldDelegate-self, und dann vielleicht das Überschreiben der textFieldDidReturn: Methode zu setzen Konfiguration, aber ich weiß auch nicht, ob es einen Weg gibt, programmatisch eine der UIAlertController ‚s Aktionen aufzurufen. Und das klingt irgendwie chaotisch/hacky. Fehle ich etwas Offensichtliches?

+0

Ich kann auch keine Möglichkeit finden, Aktionen programmgesteuert auszulösen. Was für ein Versehen ... – elsurudo

Antwort

0

Versuchen Sie dies in iOS 8.0.2, es kann es behoben haben. Mein Textfeld löst die Standardaktion "OK" aus, ohne eine Delegierung zu verwenden.

+0

Funktioniert nicht einmal in iOS 9.2. Dies ist definitiv ein Versehen. – elsurudo

1

Nicht die ideale Antwort, aber ich beenden meine Aktion des Code in ein Verfahren zu extrahieren auf, und einfach diese Methode von Aufruf sowohl der Aktion und die textFieldDidReturn: Methode im UITextFieldDelegate.

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    [textField resignFirstResponder]; 

    [self doAction:textField]; 
    [self dismissViewControllerAnimated:YES completion:NULL]; 

    return NO; 
} 
7

auf iOS 9.3, geschieht dies, wenn Sie mehrere Aktionen mit UIAlertActionStyleDefault Stil.

Stellen Sie sicher, dass Sie nur eine Möglichkeit, wie .default:

Wenn Sie eine Aktion mit UIAlertActionStyleDefault und ein weiteres hinzufügen mit UIAlertActionStyleCancel, wird die Aktion mit Standardstil

0

Swift 3 -Lösung genannt werden. Ich fand auch heraus, dass das gleiche Fehlverhalten auftritt, wenn man eine .default und eine .destructive Option verwendet ... nicht sicher, warum dies passiert.

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

Sie sollten nicht zwei "UIAlertActionStyleCancel" in UIAlertAction gesetzt.

Verwandte Themen