通过点击单元格内的图像从UITableViewCell进行筛选

rya*_*lak 3 uitableview ios segue swift xcode7

经过一段时间的努力,在寻找解决方案几个小时之后,我认为是时候问了。

我有一个由自定义UITableViewCells填充的表格视图,当前当您点击一个单元格时,它将带您到详细视图。

在自定义单元中有一个图像,我希望用户能够点击该图像并选择显示该图像的弹出式VC。

我遇到的麻烦是在点击图像时创建序列。

在自定义单元格的文件中,我在图像(pTap)上设置了轻手势识别器:

override func awakeFromNib() {
    super.awakeFromNib()

    let tap = UITapGestureRecognizer(target: self, action: #selector(PostCell.voteTapped(_:)))
    let ptap = UITapGestureRecognizer(target: self, action: #selector(PostCell.imageTapped(_:)))
    tap.numberOfTapsRequired = 1
    ptap.numberOfTapsRequired = 1
    voteImage.addGestureRecognizer(tap)
    voteImage.userInteractionEnabled = true
    featuredImg.addGestureRecognizer(ptap)
    featuredImg.userInteractionEnabled = true


}
Run Code Online (Sandbox Code Playgroud)

我还在自定义单元文件中有一个用于点击的功能:

func imageTapped(sender: UIGestureRecognizer) {

  print("image tapped")


}
Run Code Online (Sandbox Code Playgroud)

在我的视图控制器文件中,我在索引路径的选择行中添加了segue:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let post: Post!

    if inSearchMode {
        post = filteredVenues[indexPath.row]
    } else {

        post = posts[indexPath.row]
    }

    print(post?.venueName)

    performSegueWithIdentifier("imageTapped", sender: nil)



    performSegueWithIdentifier("DetailsVC", sender: post)

}
Run Code Online (Sandbox Code Playgroud)

此外,在情节提要中,我从VC创建了一个segue,将带有自定义单元格的表格视图保存到我想在点击图像时显示的VC。

我尝试了几种不同的方法来使它正常工作,但没有任何运气,您在上面看到的代码是经过多次失败尝试后剩下的代码。我觉得自定义单元文件中的敲击功能和VC文件中的segue功能是解决方案的一部分,所以这就是为什么我将它们保留在其中的原因。

任何帮助,将不胜感激。谢谢!

来自以下答案的代码更新:

新增协议

protocol ImageSegueProtocol: class {
    func imageTapped(row: Int)
}


class PostCell: UITableViewCell {
Run Code Online (Sandbox Code Playgroud)

添加了IAB功能

@IBAction func imageTapped(sender: UIGestureRecognizer) {
   guard let row = row else { return }
    delegate?.imageTapped(row)
    print("image tapped func")
}
Run Code Online (Sandbox Code Playgroud)

在主VC中声明为委托人

weak var delegate:postCell?
Run Code Online (Sandbox Code Playgroud)

分配的代尔盖特

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    //let post = posts[indexPath.row]

    if let cell = tableView.dequeueReusableCellWithIdentifier("PostCell") as? PostCell {

        var img: UIImage?
        var vImg: UIImage?
        postCell?.delegate = self
Run Code Online (Sandbox Code Playgroud)

增加了扩展功能

extension FeedVC: ImageSegueProtocol {

func imageTapped(row: Int) {
    if inSearchMode == true {
        let object = filteredVenues[row]
        performSegueWithIdentifier("imageTapped", sender: object)
        print("ext func")
    } else {
        let object = posts[row]
        performSegueWithIdentifier("imageTapped", sender: object)
        print("ext func")
    }



}
Run Code Online (Sandbox Code Playgroud)

Ros*_*ssP 5

您可以这样做:

在单元文件中,在顶部声明一个协议,然后在单元类本身内设置一些属性,并响应所点击的图像设置委托行为:

protocol SomeCellProtocol: class {
    func imageTapped(row: Int)
}


class SomeCell: UITableViewCell {

    weak var delegate: SomeCellProtocol?
    var row: Int?

    @IBAction func imageTapped() {
        guard let row = row else { return }
        delegate?.imageTapped(row)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您必须使ViewController采用SomeCellProtocol并像这样调用内部的segue:

extension SomeViewController: SomeCellProtocol {

    func imageTapped(row: Int) {
        //get object from array and call segue here
    }
}
Run Code Online (Sandbox Code Playgroud)

并且必须通过调用以下命令将ViewController设置为单元的委托:

someCell.delegate = self
Run Code Online (Sandbox Code Playgroud)

并将该行传递到单元格:

someCell.row = indexPath.row
Run Code Online (Sandbox Code Playgroud)

在ViewController的cellForRowAtIndexPath方法中。

因此,当在单元格中点击按钮时(或者您可以在ImageView上使用GestureRecognizer进行操作),它将强制委托(ViewController)调用其imageTapped函数,并传递一个行参数,您可以将其用于确定应通过Segue传递表中的哪个对象(其对应的数据数组)。