当用户输入错误时,我正在运行以下代码。如果发生错误,则会显示警报,并且应该选择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)
答案 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作为当前显示视图的子视图返回时执行。