UIGestureRecognizer не отправляет действие другому классу - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь отправить действие из UIGestureRecognizer класса UIView в родительский View Controller.

HomeViewController содержит представление, которое содержит несколько (5) представлений OperationView.

Расширения OperationView расширяетUIView выглядит так:

class OperationView: UIView {
    override func awakeFromNib() {
        super.awakeFromNib()

        // OperationView is on a view that has HomeViewController as it's controller in StoryBoard
        let swipeGestureRecognizer = UISwipeGestureRecognizer(target: HomeViewController.self(), action: #selector(HomeViewController.operatorWasSwiped(_:)))
        swipeGestureRecognizer.direction = .left

        let tapGestureRecognizer = UITapGestureRecognizer(target: HomeViewController.self(), action: #selector(HomeViewController.operatorWasSwiped(_:)))

        self.addGestureRecognizer(swipeGestureRecognizer)
        self.addGestureRecognizer(tapGestureRecognizer)
    }

А в HomeViewController у меня есть эта функция, которая должна вызываться UIGestureRecognizers:

@objc func operatorWasSwiped(_ sender : UIGestureRecognizer) {
    if (sender.isKind(of: UITapGestureRecognizer.self)) { print("Tapped") }
    else { print("Swiped") }

    self.performSegue(withIdentifier: "segue1", sender: nil)
}

Однако я ничего не получаю.Даже не ошибка.

Я пытался добавить UIGestureRecognizer к каждому OperationView, используя IBOutlet на HomeViewController, например:

view1.swipeGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view2.swipeGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view3.swipeGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view4.swipeGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view5.swipeGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))

view1.tapGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view2.tapGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view3.tapGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view4.tapGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view5.tapGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))

view1.addGestureRecognizer(view1.swipeGestureRecognizer!)
view2.addGestureRecognizer(view2.swipeGestureRecognizer!)
view3.addGestureRecognizer(view3.swipeGestureRecognizer!)
view4.addGestureRecognizer(view4.swipeGestureRecognizer!)
view.addGestureRecognizer(view5.swipeGestureRecognizer!)

view1.addGestureRecognizer(view1.tapGestureRecognizer!)
view2.addGestureRecognizer(view2.tapGestureRecognizer!)
view3.addGestureRecognizer(view3.tapGestureRecognizer!)
view4.addGestureRecognizer(view4.tapGestureRecognizer!)
view5.addGestureRecognizer(view5.tapGestureRecognizer!)

Где я добавил:

var swipeGestureRecognizer: UISwipeGestureRecognizer?
var tapGestureRecognizer: UITapGestureRecognizer?

К классу переменных для OperationView

И это работает, но это далеко не элегантно (представьте, если бы мне пришлось добавить другое представление ... вроде бы победил смысл моей предыдущей абстракции)

Есть идеи, что происходит?Или чего мне не хватает?

Я использую Swift 4 и Xcode 9

1 Ответ

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

Вы создаете этот жест внутри метода, и этот жест может существовать только в этой области, пока вызывается функция.Так что технически исчезает, прежде чем использовать его.Таким образом, создание экземпляра этого жеста вне метода может существовать, пока существует представление.Если это имеет смысл.

ОБНОВЛЕНИЕ: Как указано в комментариях, нам нужна текущая ссылка на родительский viewController.

Как насчет этого ...

class OperationView: UIView {

let swipeGestureRecognizer = UISwipeGestureRecognizer()
let tapGestureRecognizer = UITapGestureRecognizer()

override func awakeFromNib() {
    super.awakeFromNib()

    if let parentViewController = parentViewController {
    swipeGestureRecognizer.addTarget(parentViewController, action: #selector(HomeViewController.operatorWasSwiped(_:)))
    swipeGestureRecognizer.direction = .left

    tapGestureRecognizer.addTarget(parentViewController, action: #selector(HomeViewController.operatorWasSwiped(_:)))

    self.addGestureRecognizer(swipeGestureRecognizer)
    self.addGestureRecognizer(tapGestureRecognizer)
    }

   }
}

extension UIView {

var parentViewController: UIViewController? {
    var parentResponder: UIResponder? = self

    while parentResponder != nil {
        parentResponder = parentResponder!.next

        if let viewController = parentResponder as? UIViewController {
            return viewController
        }
    }
    return nil
   }
}
...