我有一个带单元格的tableView。每个单元都有一个imageView。当我单击imageView时,我想使用传入的参数执行一个函数。我知道如何单击imageViews的唯一方法是这样的:
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(printNumber))
cell.imageView.addGestureRecognizer(gestureRecognizer)
@objc func printNumber(){
print("4")
}
现在,想像一下这完全相同,但是我想将数字传递到函数中进行打印我已经看过一百万篇关于如何无法将参数传递到选择器的文章,所以我不确定在这种情况下该怎么做。
我想做这样的事情(我知道,你不能这样做)
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(printNumber(num: 4))
cell.imageView.addGestureRecognizer(gestureRecognizer)
@objc func printNumber(String: num){
print(num)
}
我需要这样做,因为每个按钮在按下时都会有不同的输出,具体取决于单元格中的其他变量。
您不需要输入数字。假设识别器在图像视图中,您:
关于一般地沿着响应者链走:
extension UIResponder {
func firstParent<Responder: UIResponder>(ofType type: Responder.Type ) -> Responder? {
next as? Responder ?? next.flatMap { $0.firstParent(ofType: type) }
}
}
所以您的代码是:
guard let cell = recognizer.view?.firstParent(ofType: UITableViewCell.self),
let tableView = recognizer.view?.firstParent(ofType: UITableView.self),
let indexPath = tableview.indexPath(for: cell) else {
return
}
// Do stuff with indexPath here
使用accessibilityIdentifier属性,仅当您仍想使用] #selector
,以便UIGestureRecognizer
可以读取值对象的值。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! YourTableViewCell
…
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(printNumber))
cell.imageView.accessibilityValue = String(4)
cell. imageView.isUserInteractionEnabled = true
cell.imageView.addGestureRecognizer(gestureRecognizer)
…
return cell
}
@objc func printNumber(sender: UITapGestureRecognizer) {
if let id = sender.view?.accessibilityIdentifier {
print(tag)
}
}