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
但它不起作用。我在这里尝试不可能,我应该只使用默认通知吗?还是其他什么?
答案 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