从 UITextField 子类捕获委托方法而不是委托

Capture delegate methods from UITextField subclass without being the delegate

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

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

在你的子类中做

self.addTarget(self, action: #selector(returnKeyPressed), for: .editingDidEndOnExit);

查看 Apples 文档,您会看到 UIControlEvents

UIControlEventEditingDidEndOnExit = 1 << 19, // 'return key' ending editing

您可以将您的 viewController 设置为代表。在viewDidLoad中你可以添加这行代码。

myTextField.delegate = self

您还需要 viewController 的 UITextFieldDelegate 协议。

extension MyViewController: UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        //User tapped the return button
        return true
    }
}

我认为将委托设置为subclass没有错。如果您需要知道 class 之外的水龙头,那么您将需要另一个代表,因此您不妨使用我的第一个解决方案。您还应该知道,如果您更改委托,您在 subclass 中的代码将不会再被调用,这可能会导致意外行为。