将UIGestureRecorgniser的委托设置为parent

时间:2016-11-23 11:01:19

标签: swift inheritance uiview

我有一个继承自UIView的自定义类。在本课程中,我为其添加了一个手势识别器

//CustomParentView.swift 

class CustomParentView: UIView, UIGestureRecognizerDelegate {

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupGestureRecognizer()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    func setupGestureRecognizer() {
        let tap = UITapGestureRecognizer(target: self, action: #selector(CustomParentView.viewTapped(sender:)))
        tap.delegate = self
        self.addGestureRecognizer(tap)
    }

    func viewTapped(sender: UITapGestureRecognizer) {
        print("View tapped")
    }
}

然后我有另一个继承自CustomParentView的类,我最终会有一些继承自它的UIViews,但是手势识别器的委托没有被设置为CustomParentView,它被设置为继承它的视图。这意味着我需要将viewTapped函数移动到每个CustomParentView的子类中,并在每个类中重复此函数。

所以我的问题是如何将手势识别器的委托设置为CustomParentView并使其保持CustomParentView

1 个答案:

答案 0 :(得分:0)

  

然后我有另一个继承自CustomParentView的类,我   最终会有一些从它继承的UIViews,但是   手势识别器的委托未设置为CustomParentView,   它被设置为继承它的视图。

您指定为手势识别器委托的哪个类无关紧要,只需实现UIGestureRecognizerDelegate协议即可。 CustomParentView的任何子类都将实现此协议,因为基类具有此功能。

  

这意味着我需要将viewTapped函数移动到每个CustomParentView的子类中,并在每个类中重复此函数。

不,不。这不是面向对象编程和继承的工作方式。 CustomParentView的所有子类都将使用viewTapped方法。

  

所以我的问题是如何设置手势识别器的委托   成为CustomParentView并保持CustomParentView

你有什么作品。你试过吗?

您还应该从另一个setupGestureRecognizer致电init,以便它适用于在故事板中创建的视图:

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    setupGestureRecognizer()
}