如果出现警报,则无法首先设置UITextField的selectedTextRange

时间:2016-09-22 01:48:59

标签: ios swift uitextfield

当用户输入错误时,我正在运行以下代码。如果发生错误,则会显示警报,并且应该选择UITextField中的文本。如果我在选择文本之前运行我的警报函数showErrorAlert()(如下所示),则永远不会选择文本。如果我注释掉警报功能,文本选择似乎工作正常(在输入字段中选择整个文本)。我不确定在调用我的警报功能后,我需要做什么才能让selectedTextRange正确选择。感谢您容忍n00b问题。

// showErrorAlert Function

func showErrorAlert(title: String, message: String) {
    let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)

    let defaultAction = UIAlertAction(title: "OK", style: .default, handler: nil)
    alertController.addAction(defaultAction)

    present(alertController, animated: true, completion: nil)

}

//发生输入错误时......

    showErrorAlert(title: "ERROR", message: "Please type numbers, only.")

    inputText.becomeFirstResponder()
    let textBeginning = inputText.beginningOfDocument
    let textEnd = inputText.endOfDocument
    inputText.selectedTextRange = inputText.textRange(from: textBeginning, to: textEnd)

1 个答案:

答案 0 :(得分:2)

尝试将您的选择代码放在defaultAction的完成处理程序中。这种方式将在用户确认并解除警报后进行选择。像这样:

func showErrorAlert(title: String, message: String) {
    let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)

    let defaultAction = UIAlertAction(title: "OK", style: .default) { (action) in
        self.textInput.becomeFirstResponder()
        let textBeginning = self.textInput.beginningOfDocument
        let textEnd = self.textInput.endOfDocument
        self.textInput.selectedTextRange = self.textInput.textRange(from: textBeginning, to: textEnd)
    }
    alertController.addAction(defaultAction)

    present(alertController, animated: true, completion: nil)
}

我刚在设备上测试了这个。

解释

当您致电present(alertController...)时,您正在以模态方式呈现视图控制器。在原始代码中,您调用showErrorAlert然后呈现一个新的视图控制器(在这种情况下恰好是一个名为UIAlertController的UIViewController子类)。那完全没问题。

但是当你在呈现这个新的视图控制器之后立即出现问题时 - 尝试在UITextField中选择不是当前呈现视图的子视图的文本。解决此问题的方法是在defaultAction的完成处理程序中调用此选择代码。这样可确保您的选择代码仅在取消警报后以及当您的UITextField作为当前显示视图的子视图返回时执行。