我可以将代表链接在一起吗?
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
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