通过点击单元格内的图像从UITableViewCell查询

时间:2016-07-31 11:37:00

标签: ios swift uitableview xcode7 segue

现在试图解决这个问题一段时间,经过几个小时的寻找解决方案,我决定是时候问了。

我有一个由自定义UITableViewCells填充的tableview,当前当你点击一个单元格时,它会带你进入详细视图。

在自定义单元格中有一个图像,我希望用户能够点击该图像并转到显示图像的popover VC。

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

在自定义单元格的文件中,我在图片 (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


}

我也在自定义单元格文件中有一个功能:

func imageTapped(sender: UIGestureRecognizer) {

  print("image tapped")


}

在我的视图控制器文件中,我在索引路径的did select行中添加了一个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)

}

另外,在故事板中我创建了一个来自VC的segue,它将自定义单元格的表格视图保存到VC中,我想在点击图像时显示。

我已经尝试了几种不同的方法让它工作并且没有任何运气,上面看到的代码是我经过多次尝试失败后仍然存在的代码。我觉得自定义单元文件中的tap和VC文件中的segue的功能是解决方案的一部分,所以我就把它们留在了。

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

根据以下答案更新代码:

添加协议

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


class PostCell: UITableViewCell {

添加了IAB Func

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

在主VC中声明委托

weak var delegate:postCell?

指定Delgate

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

添加了扩展功能

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")
    }



}

3 个答案:

答案 0 :(得分:4)

你可以这样做:

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

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;

class HomeController extends Controller
{
    public function index() {
        return '<form action="'. route('home') .'" method="post"><input type="text" name="email"><input type="submit"></form>';
    }
    public function create(Request $request) {
        dd($request->email);
    }
}

然后你必须让你的ViewController采用SomeCellProtocol并像这样调用segue:

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)
    }
}

您必须通过调用:

将ViewController设置为您的单元格的委托
extension SomeViewController: SomeCellProtocol {

    func imageTapped(row: Int) {
        //get object from array and call segue here
    }
}

并将行传递给单元格:

someCell.delegate = self

在ViewController的cellForRowAtIndexPath方法中。

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

答案 1 :(得分:0)

您需要做的是创建一个按钮而不是图像,此按钮将保存实际图像:

enter image description here

其余的很简单,ctrl将IBAction拖到自定义单元格文件中。 现在,您需要与View Controller进行通信,以便调用您的segue方法。

您可以使用2种设计模式实现这一目标:

  1. 使用post notification

    在View Controller中添加一个观察者:

    NSNotificationCenter.defaultCenter().addObserver(self,
                              selector: #selector(YourViewController.cellSelected(_:)),
                              name: "CellSelectedNotificationName",
                              object: nil)
    

    View Controller中的方法cellSelected应如下所示:

    func cellSelected(notification : NSNotification)
    {
      if let passedObject = notification.object as? YourCustomObject
      {
       // Do what ever you need with your passed object
       // When you're done, you can invoke performeSegue that will call prepareForSegue
       // When invoking performeSegue you can pass your custom object
      }
     }
    

    在您的CustomCell类中,按钮的IBAction方法:

    @IBAction func buttonTapped()
    {
      // Prepare the object you want to pass...
      NSNotificationCenter.defaultCenter().postNotificationName("CellSelectedNotificationName", object: YourCustomObjectYouWantToPass)
     } 
    

    在坚果壳中,单击了单元格内的按钮,您在该单元格内创建了一个对象,然后使用通知中心将其传递给View Controller。现在,您可以使用自定义对象进行调整。

  2. 注意:如果您不需要传递对象,您基本上可以从UIButton(在故事板上)按住Ctrl键并拖动到另一个视图控制器。

    1. 使用指向视图控制器的delegate
    2. 祝你好运。

答案 2 :(得分:0)

正如OhadM所说,创建一个按钮并将背景图像设置为您想要显示的图像。从那里,你甚至不需要IBAction。 按住 - 从按钮拖动到下一个视图控制器并创建segue

然后,如果你想在segue之前做任何设置,在第一个VC你会有类似的东西:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        if segue.identifier == "imageButtonPressed" { // Make sure you name the segue to match

            let controller = segue.destinationViewController as! SecondVC
            controller.someText = "Hi"
            controller.someInt = 5
        }
}