从 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 的委托方法?

UITextField 事件处理

UITextField 的子类

UITextField 委托“shouldChangeCharactersIn”不为文本字段中的第一个条目调用

UITextField 子类 - 订阅事件