单击ImageView并执行Swift / Xcode中没有选择器的功能

问题描述 投票:-1回答:2

我有一个带单元格的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)
}

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

ios swift uibutton uiimageview selector
2个回答
0
投票

您不需要输入数字。假设识别器在图像视图中,您:

  1. 获取gestures.view(这是图像视图)
  2. 步行响应者链以找到父表视图单元格和表视图
  3. 向表视图查询表视图单元格的索引路径(这基本上是您要传递的数字)
  4. 使用电话号码拨打您的电话

关于一般地沿着响应者链走:

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

0
投票

使用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)
        }
 }
© www.soinside.com 2019 - 2024. All rights reserved.