斯威夫特| DynamicTableView - 使用ImageView触发操作

时间:2017-09-27 18:00:47

标签: ios swift xcode uitableview

我有一个DynamicTableView,每个Cell都有一个ImageView。如何知道indexPath.row?

进行操作

我知道的唯一方法是创建一个TapGestureRecognizer - 这有效,但我不知道我点击了哪一行。

所以我需要TableView中的DidSelectRowAt:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {}

只有当我按ImageView而不是整行时才会发生此操作,因此我无法使用TableView中的DidSelectRowAt。

这就是我现在所做的:

class DownloadsViewController: UITableViewController {

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


    let tap = UITapGestureRecognizer(target: self, action: #selector(DownloadsViewController.tappedMe))

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! DownloadsViewCell

        cell.fileInfo.image = UIImage(named: "detail1")
        cell.fileInfo.addGestureRecognizer(tap)
        cell.fileInfo.isUserInteractionEnabled = true

}

func tappedMe(){
    print(arrayDocuments(IndexPath.row))
}
}

我的整个DownloadViewContoller类代码is here

我的DownloadViewCell屏幕截图is here

有没有人有想法?

谢谢!

5 个答案:

答案 0 :(得分:2)

  1. 向您的单元格添加属性:var indexPath: IndexPath

  2. cellForRowAtIndexPath:执行cell.indexPath = indexPath

  3. 在您的单元格子类中,将tapGestureRecognizer添加到UIImageView,触发单元子类中的方法。

  4. 为您的手机制作委托协议:

    protocol YourCellDelegate: class {
    
       func imagePressed(indexPath: IndexPath)
    
    }
    
  5. 让ViewController采用此协议。

  6. 在您的单元格子类中添加属性weak var delegate: YourCellDelegate?
  7. cellForRowAtIndexPath:执行cell.delegate = self
  8. 在单元格tapRecognizer选择器中调用委托方法delegate?.imagePressed(indexPath: indexPath)
  9. 在viewController中,您将以indexPath作为参数接收imagePressed方法调用。

答案 1 :(得分:0)

你是否试图通过

获取细胞
recognizer.view

点击手势方法和

func indexPath(for cell: UITableViewCell) -> IndexPath?

返回一个索引路径,表示给定表视图单元格的行和部分。

答案 2 :(得分:0)

这是一个使用自定义UIImageView子类的解决方案。

  • 创建UIImageView的子类 - MyImageView(或更合适的其他内容)
  • 为子类创建委托 - MyImageViewDelegate
  • 添加名为myImageViewTapped(imageView: MyImageView)
  • 的委托方法
  • 覆盖touchesEnded方法以调用委托方法
  • 在名为MyImageView的{​​{1}}中添加一个属性,用于存储此图像视图所在单元格的索引路径。
  • 在表格单元格中,使用indexPath代替常规MyImageView
  • UIImageView的代理设置为MyImageView,即VC。
  • self设为true
  • isUserInteractionEnabled中,将图片视图的cellForRowAtIndexPath设置为indexPath参数
  • 现在实现委托方法,在方法中,您将通过访问indexPath知道点击了哪个图片视图!

答案 3 :(得分:0)

只需像以前一样设置ImageView,然后只需在其上添加一个空白按钮,并使用来自Ilya V.的回答中的方法和IBAction

答案 4 :(得分:0)

您可以使用属性“ tag” imageView保存indexPath.row并稍后在选择器中使用它

class DownloadsViewController: UITableViewController {

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {    
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! DownloadsViewCell

    cell.fileInfo.image = UIImage(named: "detail1")
    cell.fileInfo.isUserInteractionEnabled = true

    let tap = UITapGestureRecognizer(target: self, action: #selector(tappedMe(_ :)))
    cell.fileInfo.addGestureRecognizer(tap)
}

@objc func tappedMe(_ sender: AnyObject){
    print("Tap to imageView in cell No. - \(sender.view.tag)")
}
}