单击UITableView单元格内的图像

时间:2017-04-03 15:27:32

标签: ios swift uitableview

我在uitableview的一个单元格中有两个图像,这些图像显示来自外部服务器的图像,并且它们的每个标记都有该图像所代表的项目ID,如果我点击此图像,我需要将用户移动到新视图控制器显示此项目的详细信息,我强制出现问题,用户需要双击显示详细信息而不是单击,下面是我的代码:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let cell = self.tableView.cellForRow(at: indexPath as IndexPath) as! prodctCell
        Id1stMove =  cell.image1st.tag
        let tapGesture = UITapGestureRecognizer (target: self, action: #selector(ItemsController.imgTap))
        cell.image1st.addGestureRecognizer(tapGesture)
        cell.image1st.isUserInteractionEnabled = true

        let cell1 = self.tableView.cellForRow(at: indexPath as IndexPath) as! prodctCell
        Id2ndMove =  cell1.image2nd.tag
        let tapGesture1 = UITapGestureRecognizer (target: self, action: #selector(ItemsController.imgTap1))
        cell1.image2nd.addGestureRecognizer(tapGesture1)
    }


func imgTap()
    {
        let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "testViewController") as? testViewController
            let navController = UINavigationController(rootViewController: secondViewController!)
            navController.setViewControllers([secondViewController!], animated:true)
            self.revealViewController().setFront(navController, animated: true)
            revealViewController().pushFrontViewController(navController, animated: true)
        secondViewController?.movmentId = Id1stMove
        updateCount(itemId: Id1stMove)

    }

4 个答案:

答案 0 :(得分:4)

昨天我自己创建了样本并尝试过。我得到了解决方案。但是当我做一些工作时,我无法立即发布我的答案。

现在我会给你答案。我不希望得到以下答案的声誉。

第一次点击或点按图片时,会导航。

您不需要在didSelectRowAt方法中为imageView添加TapGestureRecognizer。您需要在cellForRowAt方法中为图像视图添加TapGestureRecognizer。

import UIKit

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
    let mobiles: [String] = ["iPhone", "Android"]
    let images: [String] = ["iPhone.png", "android.png"]
    @IBOutlet var tableViewImageTapping: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // number of rows in table view
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.mobiles.count
    }

    // create a cell for each table view row
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        var cell:UITableViewCell? = tableView.dequeueReusableCell(withIdentifier: "cell")
        if (cell == nil) {
            cell = UITableViewCell(style:UITableViewCellStyle.default, reuseIdentifier:"cell")
        }
        cell?.textLabel?.text = self.mobiles[indexPath.row]
        let strImageName = images[indexPath.row]
        cell?.imageView?.image = UIImage(named: strImageName)
        cell?.imageView?.tag = indexPath.row
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
        tapGestureRecognizer.numberOfTapsRequired = 1
        cell?.imageView?.isUserInteractionEnabled = true
        cell?.imageView?.addGestureRecognizer(tapGestureRecognizer)
        return cell!
    }

    // method to run when table view cell is selected
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("You tapped table view cell index is \(indexPath.row).")
    }

    // method to run when imageview is tapped
    func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
    {
        let imgView = tapGestureRecognizer.view as! UIImageView
        print("your taped image view tag is : \(imgView.tag)")
        if (imgView.tag == 0) //Give your image View tag
        {
            //navigate to next view
        }
        else{

        }
    }
} 

输出截图

enter image description here

印刷结果

首次点击第一张图片时

enter image description here

然后在第一次单击时单击第二个图像

enter image description here

答案 1 :(得分:2)

您需要在cellForRowAt indexPath中执行此代码,而不是选择。

如你所说,你想使用标签值中的图片ID,我建议在下面更改,除了在cellForRowAt indexPath中添加代码:

更改tapGesture代码如下:

let tapGesture = UITapGestureRecognizer (target: self, action: #selector(imgTap(tapGesture:)))

和imgTap功能:

 func imgTap(tapGesture: UITapGestureRecognizer) {
        let imgView = tapGesture.view as! UIImageView
        let idToMove = imgView.tag
       //Do further execution where you need idToMove

    }

答案 2 :(得分:0)

  1. 请勿使用force unwrap as! prodctCell
  2. 请使用名称swift命名约定
  3. 不要使用.tag单元格通常会重复使用它可能会在某些边缘情况下中断
  4. 现在回到你的问题,你已经有一个保存图像的自定义单元格。 你有几种可能性

    1. 将手势识别器添加到imageView 您可以将其更改为按钮
    2. 在图像视图上添加一个按钮(没有标题或图像)
    3. 然后为按钮/手势识别器创建一个@IBAction,以及一个调用主viewController的委托方法,您可以在其中传递所需的所有数据以实例化第二个VC

      <强>更新 我建议不要在cellForRow中添加处理tap的逻辑,viewController不是为了处理和管理他的子逻辑。

答案 3 :(得分:0)

您正在“在索引路径中选择行”方法中分配手势识别器,这意味着用户必须选择(点击)一个单元格以将手势识别器分配给图像,然后用户必须点击那些识别器的图像通过调用“imgTap()”作出反应,这是两个水龙头。

您应该做的是在“索引路径中的行的单元格”方法中分配手势识别器,因此当您创建每个单元格时,您还可以创建手势识别器,这样当用户第一次点击图像时识别出水龙头并调用“imgTap()”。

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

    // Configure the cell...

    let tapGesture1 = UITapGestureRecognizer (target: self, action: #selector(ItemsController.imgTap))
    cell.image1st.addGestureRecognizer(tapGesture1)
    let tapGesture2 = UITapGestureRecognizer (target: self, action: #selector(ItemsController.imgTap))
    cell.image2nd.addGestureRecognizer(tapGesture2)

    return cell
}

我还建议稍微更改一下代码,这样你就可以用一个参数(被点击的内容的id)调用“imgTap()”,而不是使用2个方法“imgTap()”和“imgTap1()”。 / p>