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

Posted

技术标签:

【中文标题】单击 ImageView 并在 Swift/Xcode 中执行没有选择器的函数【英文标题】:Click on ImageView and execute function WITHOUT selectors in Swift/Xcode 【发布时间】:2020-01-06 23:24:05 【问题描述】:

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

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

【问题讨论】:

你在找这个吗? ***.com/questions/38445262/… 该死的,可能是它,我回家后检查一下,谢谢伙计! 【参考方案1】:

您无需输入号码。假设识别器在图像视图上,您​​:

    获取gestures.view(这是图像视图) 沿着响应者链查找父 tableview 单元格和 table view 向 tableview 询问 tableview 单元格的索引路径(这基本上就是你要传入的他的编号) 使用号码调用您的函数

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

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

【讨论】:

嗯,谢谢你,我想我明白你在说什么了,你能写一个像我给出的例子一样的例子,打印出按下按钮的单元格的索引路径号吗?【参考方案2】:

使用 accessibilityIdentifier 属性,仅当您仍想使用#selector,以便UIGestureRecognizer 可以读取值对象的值。 p>

 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)
        
 

【讨论】:

以上是关于单击 ImageView 并在 Swift/Xcode 中执行没有选择器的函数的主要内容,如果未能解决你的问题,请参考以下文章

从图库中获取图像并在 ImageView 中显示

Android:单击相机中的图像并在对话框中显示图像

如果为空,则显示 imageview onclick 并在没有 imageview 的情况下发布

如何缩放 + 裁剪图像并在 imageview 上显示裁剪的图像

单击 CollectionViewCell 内的 ImageView 以转到 ViewController

单击 ImageView 时如何打开滑动导航抽屉?