我可以将代表链接在一起吗?

Can I chain delegates together?

Swift 4.0 iOS 11.x

我创建了一个使用 UITextFieldDelegate 的简单文本字段 class。我想向它添加一个附加协议,我可以用它来传递一个事实,即对所述字段的文本输入已完成。委托链,因为一旦我发现文本输入已退出自定义 class 的事实,我就无法将其传递给 VC,其中 UITextField class 似乎在其中.

import UIKit

protocol ExitedFieldDelegate {
  func exited(info: String)
}

class IDText: UITextField, UITextFieldDelegate {

  internal var zeus: ExitedFieldDelegate? = nil

  required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)!
    delegate = self
  }

  required override init(frame: CGRect) {
    super.init(frame: frame)
    delegate = self
  }

  func textFieldDidBeginEditing(_ textField: UITextField) {
    self.textColor = UIColor.black
  }

  func textFieldDidEndEditing(_ textField: UITextField, reason: UITextFieldDidEndEditingReason) {
    if (delegate != nil) {
        let info = self.text
        zeus?.exited(info: info!)
    }
  }

}

我将此代码添加到 viewController 我想在其中使用我的自定义 class。

class ConfigViewController: UIViewController, ExitedFieldDelegate 

当然还有协议要求的方法

func exited(info: String) {
    print("The brain has left the room")
}

我让它成为上述协议的代表,所以我得到了它

var blah = IDText()
blah.delegate = self

但这行不通。我在这里尝试不可能的事情,我应该只使用默认通知吗?还是别的东西?

通过设置:

blah.delegate = self

您正在覆盖初始化程序中将委托设置为 self

你要的是重写:

internal var zeus: ExitedFieldDelegate? = nil

至:

weak var zeus: ExitedFieldDelegate?

为了能够使用 weak(你希望它能防止保留循环),将协议定义更新为:

protocol ExitedFieldDelegate: class {
    func exited(info: String)
}

然后更改为:

var blah = IDText()
blah.delegate = self

至:

var blah = IDText()
// you want to set zeus instead of the delegate field
blah.zeus = self