Home > Net >  How to UITableView Click image and title
How to UITableView Click image and title

Time:11-16

I've created a tableView, but when I click it, I don't get any results. I wanted to add a new feature to improve my project, but I couldn't add the videos I watched and the things I researched.

Table View

import UIKit

class ViewController1: UIViewController {

    @IBOutlet weak var FoodView: UITableView!
    
    let dogfoods = ["pork", "banana", "chicken-leg"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        FoodView.delegate = self
        FoodView.dataSource = self
        // not tapped no see
        FoodView.allowsSelection = false
    }
    

    
}

extension ViewController1: UITableViewDelegate, UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 120
    }
    
    
    
    
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dogfoods.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = FoodView.dequeueReusableCell(withIdentifier: "CustomCell") as! CustomCell
        let dogfood = dogfoods[indexPath.row]
        cell.foodImageView.image = UIImage(named: dogfood)
        cell.nameLabel.text = dogfood
        
        return cell
    }
    
    
}

CustomCell

class CustomCell: UITableViewCell {

    @IBOutlet weak var dogView: UIView!
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var foodImageView: UIImageView!
    
    
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

When I click on one of the cells in the picture, I want to write a larger version of the picture and a description, how can I do this? When I searched on the internet, I applied similar ones, but I couldn't get any results.

CodePudding user response:

You have a few choices. You can add one or more buttons to your custom cell. You can attach a tap gesture recognizer to your cell's content view.

Probably the easiest way to respond to a tap on the whole cell is to have view controller conform to the UITableViewDelegate protocol and implement the tableView(_:didSelectRowAt:) method.

That method will be called when the user selects a cell, and you would use the indexPath of the tapped cell to figure out which one was tapped and do whatever is appropriate.

CodePudding user response:

You can do that with easy and efficient way using Delegate in Swift

//create protocol as we used interface in Java

@objc protocol TableViewCellDelegate {
    @objc func click(indexPath: IndexPath?)
}

// Modify your class CustomCell as:

@IBOutlet weak var dogView: UIView!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var foodImageView: UIImageView!

var delegate: TableViewCellDelegate?
var indexPath: IndexPath?

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
    foodImageView.isUserInteractionEnabled = true
    foodImageView.addGestureRecognizer(tapGestureRecognizer)
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

@objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer) {
let tappedImage = tapGestureRecognizer.view as! UIImageView

    self.delegate.click?(indexPath: self.indexPath)
}

// Modify your tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) in ViewController1 as

let cell = FoodView.dequeueReusableCell(withIdentifier: "CustomCell") as! CustomCell
cell.delegate = self
cell.indexPath = indexPath
let dogfood = dogfoods[indexPath.row]
cell.foodImageView.image = UIImage(named: dogfood)
cell.nameLabel.text = dogfood
return cell

// And now add extension add the end of ViewController1

extension ViewController1: TableViewCellDelegate {
func click(indexPath: IndexPath?) {
    // open image for preview here
}
}

CodePudding user response:

You can do it in many ways

  1. use a add a UITableViewDelegate method which is

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){ //your code...
    }

it will called every time when cell clicked.

  1. if you prefer to trigger any button click rather then cell click then go for delegate (Izaan Saleem already explained), or you can use NotificationCenter, but for this task I prefer didSelect or delegate solution.
  • Related