带文本字段的UIAlertController - 点击返回按钮只隐藏键盘,不执行操作?

时间:2014-09-25 00:00:32

标签: ios8 uialertcontroller

我尝试使用iOS 8 UIAlertController代替我过去使用UIAlertView的地方。我希望用户能够在此警报中输入文本并点击" OK"处理文本或"取消"取消。

这是基本代码:

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

使用旧版UIAlertView,我会使用alertViewStyle UIAlertViewStylePlainTextInput对其进行标记。然后,如果用户点击"返回"输入文本后键盘上的按钮,UIAlertViewDelegate方法willDismissWithButtonIndex:将被调用一些buttonIndex(取决于UIAlertView中指定的按钮)。

在新的UIAlertController中,如果用户点按了" OK"或"取消"按钮,然后按预期执行相应的操作;但如果用户只是点击"返回"键盘上的键,它只是隐藏键盘,但警报仍保留在屏幕上,不执行任何操作。

我考虑过配置文本字段以将UITextFieldDelegate设置为self,然后可能会覆盖textFieldDidReturn:方法,但我也不知道如果有办法以编程方式调用其中一个UIAlertController的操作。无论如何,这听起来有点混乱/ hacky。我错过了一些明显的东西吗?

6 个答案:

答案 0 :(得分:9)

在iOS 9.3上,如果您有多个UIAlertActionStyleDefault样式的操作,就会发生这种情况。

当您使用UIAlertActionStyleDefault添加一个操作而使用UIAlertActionStyleCancel添加另一个操作时,将调用默认样式的操作

答案 1 :(得分:1)

不是理想的答案,但我最终将我的操作代码提取到一个方法中,只需从textFieldDidReturn:中的操作和UITextFieldDelegate方法中调用该方法。 / p>

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

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

    return NO;
}

答案 2 :(得分:0)

在iOS 8.0.2中试试这个,它可能已修复它。我的文本字段触发了默认的“OK”操作,甚至没有使用任何委托。

答案 3 :(得分:0)

Swift 3解决方案:

确保您只有一个选项.default。我还发现,当使用一个.default和一个.destructive选项时会出现同样的错误行为......不确定为什么会发生这种情况。

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
        }

答案 4 :(得分:0)

这是一个古老的问题,但是自从iOS9以来,一直存在一个简单的解决方案,但我没有在此处列出,因此希望这会对其他人有所帮助。

的确,当您执行多个UIAlertActionStyleDefault操作时,当用户按下UITextField中的Enter键时,系统无法选择要触发的操作。

但是,您可以在UIAlertController上设置preferredAction属性来对此进行补救。

因此:

myAlertController.preferredAction = myDefaultAction;

现在在UITextField中按Enter键将触发您选择的UIAlertAction。

答案 5 :(得分:-1)

你不应该设置两个" UIAlertActionStyleCancel"在UIAlertAction。