在 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)