从 UITextField 子类捕获委托方法而不是委托
Posted
技术标签:
【中文标题】从 UITextField 子类捕获委托方法而不是委托【英文标题】:Capture delegate methods from UITextField subclass without being the delegate 【发布时间】:2017-10-16 13:53:23 【问题描述】:我有一个UITextField
子类。我需要知道文本何时发生变化,我可以通过NotificationCenter
和观察.UITextFieldTextDidChange
得到它,但现在我需要知道用户何时点击返回按钮。我能想到的唯一解决方案是将UITextField
子类设置为它自己的代表,但听起来并不干净。
-
有没有一种干净的方法可以从子类中获取返回键事件
可以将
UITextField
子类设置为它自己的代表吗?
【问题讨论】:
请问你为什么需要那个? 我目前正在使用“UITextFieldDelegate”,我在其中将代理设置为适当的文本字段,需要识别返回按钮。然后,如果点击了返回按钮,您可以使用 'func textFieldShouldReturn(_ textField: UITextField) -> Bool' 进行识别。不过,我不能 100% 确定这是否是最干净的解决方案。 这里有一个关于你问题的第二点的有趣讨论:***.com/questions/29054602/… @Andrea 试图使 textField 适合用作搜索文本字段,我最终将 textField 放在 UIView 中并使该视图成为委托的好处是我可以隐藏文本字段 (private
) 并公开只需要的内容
【参考方案1】:
在你的子类中做
self.addTarget(self, action: #selector(returnKeyPressed), for: .editingDidEndOnExit);
查看 Apple 文档,您会看到 UIControlEvents
UIControlEventEditingDidEndOnExit = 1
【讨论】:
很高兴知道。这回答了这个问题。但我最终将 textField 包装在UIView
中,并使其成为 UITextField
的代表,可以是 private
【参考方案2】:
您可以将您的 viewController 设置为委托。在viewDidLoad
可以添加这行代码。
myTextField.delegate = self
您还需要 viewController 的 UITextFieldDelegate 协议。
extension MyViewController: UITextFieldDelegate
func textFieldShouldReturn(_ textField: UITextField) -> Bool
//User tapped the return button
return true
我认为将委托设置为子类没有任何问题。如果您需要知道课堂外的水龙头,那么您将需要另一个代表,所以您不妨使用我的第一个解决方案。您还应该注意,如果您更改委托,您的子类中的代码将不再被调用,并且可能导致意外行为。
【讨论】:
你写的很好,他问他可以在他的UITextField
子类中做什么,并且不建议使用委托,因为子类的用户就像你上面提到的那样MyViewController
想成为代表 :)
我在询问是否将 textField 设置为自己的委托,例如:textField.delegate = self
但我知道 ViewController 可以是委托
我回答了他的两个问题。第一个在他的子类中不要求任何东西。它要求一个干净的解决方案,我认为将 ViewController 设置为委托是一个干净的解决方案。以上是关于从 UITextField 子类捕获委托方法而不是委托的主要内容,如果未能解决你的问题,请参考以下文章
如何在 XIB 中调用 UITextField 的委托方法?