【问题标题】:Set delegate of UIGestureRecorgniser to parent将 UIGestureRecorgniser 的委托设置为父级
【发布时间】:2016-11-23 11:01:19
【问题描述】:

我有一个继承自 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的类,我最终会有几个继承自它的UIView,但是手势识别器的委托没有设置为CustomParentView,它设置为继承它的视图。这意味着我需要将 viewTapped 函数移动到每个 CustomParentView 的子类中,并在每个类中重复此函数。

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

【问题讨论】:

  • 好吧,一旦您创建了子实例,其父类中的所有成员都将成为子类的成员。就像backgroundColorUIView 成员一样,但您可以在UIImageViewUITableView 等中设置它。它将表现为孩子的backgroundColor。那你想做什么?
  • 解雇父类中的父类。它的孩子会自动关闭。
  • 我不知道dismiss 到底是什么意思,但请在viewTapped() 函数self.removeFromSuperview 中尝试这一行。

标签: swift inheritance uiview


【解决方案1】:

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

您指定哪个类作为手势识别器委托并不重要,它只需要实现UIGestureRecognizerDelegate 协议即可。 CustomParentView 的任何子类都将实现此协议,因为基类会实现。

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

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

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

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

您还应该从另一个init 中调用setupGestureRecognizer,以便它与在情节提要中创建的视图一起使用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-08
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    相关资源
    最近更新 更多