我正在处理两个视图,它们是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
}
答案 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
是可选的,基类中没有默认功能。如有需要,可以随意进行更改以提供一些默认功能。