UITapGestureRecognizer не работает должным образом, если целью является нормальный класс - PullRequest
0 голосов
/ 29 октября 2018

У меня есть простой ViewController, который имеет один View в середине, когда я добавляю UITapGestureRecognizer, он будет работать правильно, но когда я пытаюсь сделать то же самое из внешнего класса, он не будет работать (метод никогда не вызывался). Мой вопрос

Какие изменения мне нужно внести в мой класс Listener, чтобы он вызывал метод внутри него

Следующий код:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var myView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        Listener(view : view , viewController: self).listen()
    }

    @objc func onNewTabArrived(){
        print("Hello from inside the controller")
    }

}


class Listener {
    let view : UIView
    let viewController: UIViewController

    init(view : UIView , viewController: UIViewController){
        self.view  = view
        self.viewController  = viewController
    }
    func listen(){
        // If you set the target as viewController it will call the method named onNewTabArrived inside it , printing "Hello from inside the controller"
        // let tab = UITapGestureRecognizer(target: viewController, action: #selector(onNewTabArrived))
        // view.addGestureRecognizer(tab)


        // This will not work! the text "Hello from inside Listener" will never be printed, How can I force it to be called ?.
         let tab = UITapGestureRecognizer(target: self, action: #selector(onNewTabArrived))
         view.addGestureRecognizer(tab)
    }

    @objc func onNewTabArrived(){
        print("Hello from inside Listener")
    }

}

1 Ответ

0 голосов
/ 29 октября 2018

Ваш Listener объект освобождается сразу после его создания. Попробуйте сохранить его в собственность

@IBOutlet weak var myView: UIView!
var listener: Listener?
override func viewDidLoad() {
    super.viewDidLoad()
    self.listener = Listener(view : view , viewController: self)
    self.listener?.listen()
}
...