快速添加目标类

时间:2018-06-26 02:26:31

标签: swift

我有一个课程,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()不会被调用。

1 个答案:

答案 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")
    }
  }
}