创建具有函数类型变量的选择器

时间:2019-01-16 00:12:06

标签: swift selector

我正在处理两个视图,它们是UITableViewCell的子类的子类。在基类(UITableViewCell的子类)中,我试图以一种方式设置手势识别器,以使每个超类都可以更改水龙头的行为(最终在其委托上调用didTapped方法)。

我写了以下代码。我可以使用#selector(tap),但是我认为在每个超类中使用变量而不是覆盖tap方法是一种更简洁的方法。甚至可以使用类似#selector(tapFunc)的东西吗?如果不是,从工程角度来看,最干净,最好的解决方案是什么?

class BaseCell: UITableViewCell {

    @objc var tapFunc: () -> () = { () in
        print("Tapped")
    }

    @objc func tap() {
        print("TEST")
    }

    func setupBasicViews(withContent: () -> ()) {

        let tapGestureRecoginzer = UITapGestureRecognizer(target: self, action: #selector(tapFunc))
        contentView.isUserInteractionEnabled = true
        contentView.addGestureRecognizer(tapGestureRecoginzer)
    }
}

然后在此视图之上建立两个视图:

class ViewA: BaseCell {

    //don't want to do this
    override func tap() {
        //do stuff
    }

    func setup {
        //setup everything else
    }

class ViewB: BaseCell {

   var delegate: ViewBProtocool?

    func setup {
        tapFunc = { () in
            delegate?.didTapped(self)
        }
        //setup everything else
    }

1 个答案:

答案 0 :(得分:4)

距离您不太远。进行以下更改:

class BaseCell: UITableViewCell {
    var tapFunc: (() -> Void)? = nil

    // Called by tap gesture
    @objc func tap() {
        tapFunc?()
    }

    func setupBasicViews(withContent: () -> ()) {

        let tapGestureRecoginzer = UITapGestureRecognizer(target: self, action: #selector(tap))
        contentView.isUserInteractionEnabled = true
        contentView.addGestureRecognizer(tapGestureRecoginzer)
    }
}

class ViewA: BaseCell {
    func setup() {
        //setup everything else
    }
}

class ViewB: BaseCell {
    var delegate: ViewBProtocol?

    func setup() {
        tapFunc = {
            delegate?.didTapped(self)
        }
        //setup everything else
    }
}

现在,每个子类都可以选择为tapFunc属性提供闭包。

我在上面显示了tapFunc是可选的,基类中没有默认功能。如有需要,可以随意进行更改以提供一些默认功能。