Swift Add Target class - PullRequest
       7

Swift Add Target class

0 голосов
/ 26 июня 2018

У меня есть класс, 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 голосов
/ 26 июня 2018

Вам необходимо сделать 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")
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...