【问题标题】:UIAlertController with text field - hitting return button only hides keyboard, does not perform action?带有文本字段的 UIAlertController - 点击返回按钮仅隐藏键盘,不执行操作?
【发布时间】:2014-09-25 00:00:32
【问题描述】:

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

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

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

【问题讨论】:

  • 我也找不到以编程方式触发操作的方法。多么疏忽……

标签: ios8 uialertcontroller


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    确实,当你有多个UIAlertActionStyleDefault动作时,当用户在UITextField中按下回车键时,系统无法选择触发哪一个。

    但是,您可以在 UIAlertController 上设置 preferredAction 属性来解决此问题。

    因此:

    myAlertController.preferredAction = myDefaultAction;
    

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

    【讨论】:

      【解决方案3】:

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

      - (BOOL)textFieldShouldReturn:(UITextField *)textField {
          [textField resignFirstResponder];
      
          [self doAction:textField];
          [self dismissViewControllerAnimated:YES completion:NULL];
      
          return NO;
      }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 在 iOS 9.2 中甚至无法使用。这绝对是一个疏忽。
        【解决方案5】:

        Swift 3 解决方案:

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

        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
                }
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-01-01
            • 1970-01-01
            • 2012-07-05
            • 2023-03-22
            • 1970-01-01
            • 2018-03-19
            • 2014-03-18
            • 2011-01-19
            相关资源
            最近更新 更多