16

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

这是基本代码:

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,我会用alertViewStyleof标记它UIAlertViewStylePlainTextInput。然后,如果用户在输入文本后点击键盘上的“Return”按钮,UIAlertViewDelegate 方法willDismissWithButtonIndex:将被调用一些buttonIndex(取决于在 中指定了哪些按钮UIAlertView)。

在新的UIAlertController中,如果用户点击“确定”或“取消”按钮,那么他们的相应动作会按预期执行;但如果用户只是按下键盘上的“Return”键,它只是隐藏了键盘,但警报仍然在屏幕上并且不执行任何操作。

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

4

6 回答 6

9

在 iOS 9.3 上,当您有多个带有UIAlertActionStyleDefault样式的操作时会发生这种情况。

当您添加一个带有 的动作UIAlertActionStyleDefault和另一个带有UIAlertActionStyleCancel的动作时,将调用具有默认样式的动作

于 2016-03-23T09:21:01.467 回答
3

这是一个老问题,但自 iOS9 以来就有一个简单的解决方案,我没有在这里看到,所以希望这对其他人有帮助。

确实,当您有多个UIAlertActionStyleDefault动作时,当用户在UITextField.

但是,您可以设置preferredActionUIAlertController 上的属性来解决此问题。

所以:

myAlertController.preferredAction = myDefaultAction;

在 UITextField 中按下回车键现在将触发您选择的 UIAlertAction。

于 2018-09-25T00:13:42.057 回答
1

不是理想的答案,但我最终将我的操作代码提取到一个方法中,并简单地textFieldDidReturn:UITextFieldDelegate.

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

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

    return NO;
}
于 2016-02-05T18:00:44.797 回答
0

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

于 2014-09-27T14:42:16.490 回答
0

斯威夫特 3 解决方案:

确保您只有一个选项作为 .default。我还发现使用一个 .default 和一个 .破坏性选项时会出现同样的不当行为......不知道为什么会发生这种情况。

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
        }
于 2016-10-24T05:22:04.963 回答
-1

您不应该在 UIAlertAction 中设置两个“UIAlertActionStyleCancel”。

于 2017-06-07T11:39:19.237 回答