我可以将代表连在一起吗?

时间:2018-03-23 11:13:55

标签: ios swift delegates swift-protocols

Swift 4.0 iOS 11.x

我创建了一个简单的文本字段类,它使用UITextFieldDelegate。我想添加一个额外的协议,我可以用来传递完成所述字段的文本条目这一事实。一个委托链,因为一旦我发现文本条目已经退出自定义类这一事实我就无法将其传递给其中包含UITextField类的VC。

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 ConfigViewController: UIViewController, ExitedFieldDelegate 

当然还有协议所需的方法

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

我让它成为所述协议的代表,所以我实现了这个

var blah = IDText()
blah.delegate = self

但它不起作用。我在这里尝试不可能,我应该只使用默认通知吗?还是其他什么?

1 个答案:

答案 0 :(得分:1)

通过设置:

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