在 UIAlertController 的文本字段中选择文本

Posted

技术标签:

【中文标题】在 UIAlertController 的文本字段中选择文本【英文标题】:Select text in UIAlertController's text field 【发布时间】:2016-03-14 15:35:15 【问题描述】:

我需要在 UIAlertController 出现后立即选择文本字段的文本。但是,我在标准 UITextField 中选择文本的方式在这里不起作用。

这是我尝试过的,但我似乎无法让它发挥作用。

let ac = UIAlertController(title: "Rename", message: nil, preferredStyle: .Alert)
ac.addTextFieldWithConfigurationHandler(
    [] (textField: UITextField) in
    textField.selectedTextRange = textField.textRangeFromPosition(textField.beginningOfDocument, toPosition: textField.endOfDocument)
    textField.text = "filename.dat"
    )
ac.addAction(UIAlertAction(title: "CANCEL", style: .Cancel, handler: nil))
ac.addAction(UIAlertAction(title: "OK", style: .Default, handler: 
    [] Void in
    // do something
    ))
dispatch_async(dispatch_get_main_queue(), 
    self.presentViewController(ac, animated: true, completion: nil)
)

有什么想法吗?

【问题讨论】:

【参考方案1】:

我已经重写了你的代码。您的类应该符合UITextFieldDelegate 协议并实现textFieldDidBeginEditing 方法,如下所示:

class ViewController: UIViewController, UITextFieldDelegate 

    override func viewDidLoad() 
        super.viewDidLoad()

        let ac = UIAlertController(title: "Rename", message: nil, preferredStyle: .Alert)
        ac.addTextFieldWithConfigurationHandler(
            [] (textField: UITextField) in
            textField.text = "filename.dat"
            textField.delegate = self

        )
        ac.addAction(UIAlertAction(title: "CANCEL", style: .Cancel, handler: nil))
        ac.addAction(UIAlertAction(title: "OK", style: .Default, handler: 
            [] Void in
            // do something
        ))
        dispatch_async(dispatch_get_main_queue(), 
            self.presentViewController(ac, animated: true, completion: nil)
        )

    
    func textFieldDidBeginEditing(textField: UITextField) 
        textField.selectedTextRange = textField.textRangeFromPosition(textField.beginningOfDocument, toPosition: textField.endOfDocument)
        textField.becomeFirstResponder()
    


【讨论】:

【参考方案2】:

一种无需添加委托即可选择所有文本的方法:

present(vc, animated: true) 
    vc.textFields?.first?.selectAll(nil)

【讨论】:

【参考方案3】:

谢谢,@ridvankucuk。您的解决方案效果很好。

但是textfield的委托功能可以稍微简化一下:

func textFieldDidBeginEditing(_ textField: UITextField) 
    textField.selectAll(nil)

【讨论】:

我注意到您在@ridvankucuk 的回答中省略了textField.becomeFirstResponder()。是否存在应该重新添加该行的情况? @ToolmakerSteve,就个人而言,我从未遇到过这种情况。调用 textFieldDidBeginEditing: 方法时,文本字段已经是第一响应者。但可能是您有一些特殊情况,当您需要再次使其成为第一响应者时。

以上是关于在 UIAlertController 的文本字段中选择文本的主要内容,如果未能解决你的问题,请参考以下文章

UIAlertController 的文本字段委托没有被调用

如何呈现带有文本字段的 UIAlertController,但该文本字段不能是第一响应者?

TextfieldShouldBeginediting Objective-c 中的 UIAlertcontroller

如何获取 UIAlertController 的文本字段值并将其用于其他功能? (斯威夫特 3)

如何在 UIAlertController 中向 UITextField 添加边距?

Swift 中显示 UIAlertcontroller 时保持键盘打开?