Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift: how to make a UIView clickable in UITableViewCell?

Inside a UITableViewCell, I am trying to implement a button with both an image and a text.

It seems the standard UIButton cannot achieve that. So I created a UIView which contains a UIImageView and a UILabel.

You can see the implementation here on the right hand side, the "follow trip" button (the "+" is an UIImageView, and "follow trip" is a UILabel)

enter image description here

I am now trying to make such UIView (i.e. the button) clickable, but I cannot find a way.

This is my implementation, but it doesn't work:

class StationsIntroHeader: UITableViewCell {

    @IBOutlet weak var bigButton: UIView!

    override  func awakeFromNib() {
        super.awakeFromNib()
        let tap = UITapGestureRecognizer(target: self, action: Selector("followTrip:"))
        bigButton.addGestureRecognizer(tap)
    }

    func followTrip(sender:UITapGestureRecognizer) {
        print("tap working")
    }
}

I have made sure the User Interaction Enabled is ON on the UIView and OFF on both the UIImageView and UILabel

like image 400
Daniele B Avatar asked Nov 11 '15 20:11

Daniele B


People also ask

How do you make a Uiview clickable in Swift?

Swift 2.0 Version: // Add tap gesture recognizer to View let tapGesture = UITapGestureRecognizer(target: self, action: Selector("onClickOnView")) tapGesture. delegate = self self. view. addGestureRecognizer(tapGesture) func onClickOnView(){ print("You clicked on view..") }

How do you make a UILabel clickable in Swift?

To make UILabel clickable you will need to enable user interaction for it. To enable user interaction for UILabel simply set the isUserInteractionEnabled property to true.


1 Answers

for me a sample setup like the following totally works:

class TableViewController: UITableViewController {
  override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 5
  }

  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    return tableView.dequeueReusableCellWithIdentifier("CustomCell", forIndexPath: indexPath)
  }
}

class CustomCell: UITableViewCell {
  @IBOutlet weak var bigButton: UIView!

  override func awakeFromNib() {
    super.awakeFromNib()
    let tap = UITapGestureRecognizer(target: self, action: Selector("bigButtonTapped:"))
    bigButton.addGestureRecognizer(tap)
  }

  func bigButtonTapped(sender: UITapGestureRecognizer) {
    print("bigButtonTapped")
  }
}

i did not change any of the default values of userInteractionEnabled for the view or imageview or label. compare my implementation with yours and see if you maybe forgot something... did you e.g. connect the outlet?

sample project: https://www.dropbox.com/sh/hpetivhc3gfrapf/AAAf6aJ0zhvRINPFJHD-iMvya?dl=0

edit for your project

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
  let headerCell = tableView.dequeueReusableCellWithIdentifier("StationsIntroHeader") as! StationsIntroHeader
  headerCell.update()
  return headerCell
  // return headerCell.update().contentView
}
like image 137
André Slotta Avatar answered Oct 31 '22 16:10

André Slotta