Ios Can';t设置UITextField';s如果显示警报,则首先选择延长时间

Ios Can';t设置UITextField';s如果显示警报,则首先选择延长时间,ios,swift,uitextfield,Ios,Swift,Uitextfield,当用户出现输入错误时,我正在运行下面的代码。如果发生错误,将显示警报,并应选择UITEXT字段中的文本。如果我在选择文本(如下所示)之前运行警报函数showErrorAlert(),则永远不会选择文本。如果我注释掉alert函数,文本选择似乎工作正常(在输入字段中选择整个文本)。我不确定在调用我的警报功能后,我需要做什么才能让selectedTextRange正确选择。感谢您接受n00b问题 //报警功能 func showErrorAlert(title: String, message: S

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

//报警功能

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)

尝试将选择代码放入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…
时,您所做的是以模态方式呈现一个新的视图控制器。在原始代码中,您调用了
batherRorAlert
,然后它将显示一个新的视图控制器(在本例中,它恰好是一个名为UIAlertController的UIViewController子类)。那太好了


但是,当您在展示这个新的视图控制器之后,立即尝试在UITextField中选择文本,而该文本不是当前展示视图的子视图时,就会出现问题。解决此问题的一种方法是在defaultAction的完成处理程序中调用此选择代码。这可确保只有在警报解除后以及UITextField作为当前显示视图的子视图返回时,才会执行选择代码。

请尝试将选择代码放置在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…
时,您所做的是以模态方式呈现一个新的视图控制器。在原始代码中,您调用了
batherRorAlert
,然后它将显示一个新的视图控制器(在本例中,它恰好是一个名为UIAlertController的UIViewController子类)。那太好了


但是,当您在展示这个新的视图控制器之后,立即尝试在UITextField中选择文本,而该文本不是当前展示视图的子视图时,就会出现问题。解决此问题的一种方法是在defaultAction的完成处理程序中调用此选择代码。这可确保只有在警报解除后以及UITextField作为当前显示视图的子视图返回时,才会执行您的选择代码。

ShowRorAlert方法在同一视图控制器上???是,两者都是同一视图控制器的一部分。ShowRorAlert方法在同一视图控制器上???是,两者都是同一视图控制器的一部分。这非常有效。知道为什么它在处理程序之外不起作用吗?我很好奇我遗漏了什么——如果在警报中处理,文本字段似乎会保持某种焦点,即使它不是警报的一部分(并且位于警报后面)。不确定为什么选择在警报呼叫之前或之后不起作用。又来了!我补充了一个解释。我希望这有帮助!这很有效。知道为什么它在处理程序之外不起作用吗?我很好奇我遗漏了什么——如果在警报中处理,文本字段似乎会保持某种焦点,即使它不是警报的一部分(并且位于警报后面)。不确定为什么选择在警报呼叫之前或之后不起作用。又来了!我补充了一个解释。我希望这有帮助!