单击 ImageView 并在 Swift/Xcode 中执行不带选择器的函数



我有一个带有单元格的表格视图。每个单元格都有一个图像视图。当我单击图像视图时,我想使用我传入的参数执行一个函数。 我知道如何点击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)
}

我需要这样做,因为按下每个按钮时都会有不同的输出,具体取决于单元格中的其他一些变量。

您不需要传入数字。 假设识别器位于图像视图上,则:

  1. 获取手势视图(这是图像视图(
  2. 沿响应程序链向上移动以查找父表视图单元格和表视图
  3. 向表视图
  4. 询问表视图单元格的索引路径(这基本上是您要传入的数字(
  5. 使用数字调用函数

至于一般地走上响应者链:

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

仅当您仍要使用#selector时,才使用accessibilityIdentifier属性,以便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)
}
}

相关内容

  • 没有找到相关文章

最新更新