【问题标题】:Capture delegate methods from UITextField subclass without being the delegate从 UITextField 子类捕获委托方法而不是委托
【发布时间】:2017-10-16 13:53:23
【问题描述】:

我有一个UITextField 子类。我需要知道文本何时发生变化,我可以通过NotificationCenter 和观察.UITextFieldTextDidChange 得到它,但现在我需要知道用户何时点击返回按钮。我能想到的唯一解决方案是将UITextField 子类设置为它自己的代表,但听起来并不干净。

  1. 有没有一种干净的方法可以从子类中获取返回键事件
  2. 可以将UITextField 子类设置为它自己的代表吗?

【问题讨论】:

  • 请问你为什么需要那个?
  • 我目前正在使用“UITextFieldDelegate”,我在其中将代理设置为适当的文本字段,需要识别返回按钮。然后,如果点击了返回按钮,您可以使用 'func textFieldShouldReturn(_ textField: UITextField) -> Bool' 进行识别。不过,我不能 100% 确定这是否是最干净的解决方案。
  • 这里有一个关于你问题的第二点的有趣讨论:stackoverflow.com/questions/29054602/…
  • @Andrea 试图使 textField 适合用作搜索文本字段,我最终将 textField 放在 UIView 中并使该视图成为委托的好处是我可以隐藏文本字段 (private) 并公开只需要的内容

标签: ios swift uitextfield nsnotificationcenter uitextfielddelegate


【解决方案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 设置为委托是一个干净的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 2012-09-26
  • 2011-10-29
相关资源
最近更新 更多