Swift 使用函数类型的变量创建选择器
我正在处理两个视图,它们是UITableViewCell的子类的子类。在UITableViewCell的基一子类中,我试图以一种方式设置手势识别器,使每个超类都可以改变行为,最终在其tap的委托上调用didTapped方法 我已经编写了以下代码。我可以使用selectortap,但是我认为在每个超类中使用变量而不是重写tap方法是一种更干净的方法。甚至可以使用selectortapFunc之类的工具吗?如果没有,从工程角度来看,什么是最干净和最好的解决方案Swift 使用函数类型的变量创建选择器,swift,selector,Swift,Selector,我正在处理两个视图,它们是UITableViewCell的子类的子类。在UITableViewCell的基一子类中,我试图以一种方式设置手势识别器,使每个超类都可以改变行为,最终在其tap的委托上调用didTapped方法 我已经编写了以下代码。我可以使用selectortap,但是我认为在每个超类中使用变量而不是重写tap方法是一种更干净的方法。甚至可以使用selectortapFunc之类的工具吗?如果没有,从工程角度来看,什么是最干净和最好的解决方案 class BaseCell: UIT
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
}
你离得不远。进行以下更改:
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是可选的,在基类中没有默认功能。如果需要的话,可以随意更改它以提供一些默认功能。我建议使用选择器类型的变量,但我更喜欢使用调用闭包的固定选择器的解决方案。投票