UIAlertController 的文本字段委托没有被调用
Posted
技术标签:
【中文标题】UIAlertController 的文本字段委托没有被调用【英文标题】:UIAlertController's textfield delegate does not get called 【发布时间】:2014-07-20 17:07:14 【问题描述】:我已经向 UIAlertController 添加了一个 UITextField,但 shouldChangeCharactersInRange
不会被解雇。为什么?我设置了委托。
let alertController = UIAlertController(title: "", message: "xxx", preferredStyle: .Alert)
self.presentViewController(alertController, animated:true, completion:nil)
let textField = UITextField()
textField.delegate = self
alertController.addTextFieldWithConfigurationHandler(nil)
在同一个类中,委托:
func textField(textField: UITextField!,
shouldChangeCharactersInRange range: NSRange,
replacementString string: String!) -> Bool
【问题讨论】:
【参考方案1】:您为其设置委托的文本字段与添加到警报控制器的文本字段不同。基本上,您正在创建一个新的 UITextField 实例,但从不给它一个框架,或者将它添加到视图层次结构中。同时,您使用addTextFieldWithConfigurationHandler()
将文本字段添加到警报控制器,但您从未为此文本字段设置委托。我相信这就是你想要的:
let alertController = UIAlertController(title: "", message: "xxx", preferredStyle: .Alert)
alertController.addTextFieldWithConfigurationHandler [weak self] (textField: UITextField!) in
textField.delegate = self
self.presentViewController(alertController, animated:true, completion:nil)
【讨论】:
【参考方案2】:我无法使用 UITextFieldDelegate
进行此操作。委托已正确设置,但未在 UIAlertController 中为 UITextField 调用。
根据How do I validate TextFields in an UIAlertController? 此处的答案,我了解到您可以改用addTarget
代替UIControl.Event.editingChanged
在编辑更改时调用选择器。
let alertController = UIAlertController(title: "Title", message: "message", preferredStyle: .alert)
alertController.addTextField (textField : UITextField!) -> Void in
/*
* Alternative to UITextFieldDelegate
*/
textField.addTarget(alertController, action: #selector(alertController.textDidChange), for: .editingChanged)
let searchAction = UIAlertAction(title: "Search", style: .default)
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil )
alertController.addAction(searchAction)
alertController.addAction(cancelAction)
present(searchAlertController, animated: true)
您可以扩展或继承 UIAlertController 以添加选择器:
extension UIAlertController
@objc func textDidChange()
guard let textField = textFields?.first else return
guard let searchAction = actions.first(where: $0.title == "Search" ) else return
let text = textField.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
searchAction.isEnabled = !text.isEmpty
【讨论】:
以上是关于UIAlertController 的文本字段委托没有被调用的主要内容,如果未能解决你的问题,请参考以下文章
iOS 8.3 UIAlertController 在尝试添加文本字段时崩溃
如何呈现带有文本字段的 UIAlertController,但该文本字段不能是第一响应者?
如何获取 UIAlertController 的文本字段值并将其用于其他功能? (斯威夫特 3)
TextfieldShouldBeginediting Objective-c 中的 UIAlertcontroller
如何在 UIAlertController 中向 UITextField 添加边距?
UIAlertController 实用程序类无法调用 UITextField 委托或目标,但在 UIViewController 中工作