我有一个课程,Listner
:
class Listner {
typealias ListenerType = () -> ()
var listeners: [ListenerType] = []
init<V: UIControl>(view: V, event: UIControlEvents, listener: @escaping ListenerType) {
print("Init") // Prints
view.addTarget(self, action: #selector(actionEvent), for: event)
self.listeners.append(listener)
}
@objc private func actionEvent() {
print("EventChanged") // Does not print
self.listeners.forEach { (listner) in
listner()
}
}
}
接受一个UIControl
的视图并为其添加目标。我知道目标已成功添加,因为当我打印view.allTargets
时,我可以看到刚刚添加的目标。
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
Listner(view: textField, event: .editingChanged) {
print("listen")
}
}
当我像上面那样调用该类并在文本字段中键入内容时,actionEvent()
不会被调用。
答案 0 :(得分:1)
您需要将Listner设置为成员变量,以便在调用viewDidLoad之后不会超出范围。如果它是成员变量,则对控件进行任何编辑时都会调用它。
class ViewController : UIViewController {
@IBOutlet weak var textField: UITextField!
var listner : Listner!
override func viewDidLoad() {
super.viewDidLoad()
self.listner = Listner(view: textField, event: .allEditingEvents) {
print("listen")
}
}
}