Norly Canarias Norly Canarias - 2 months ago 15
Swift Question

How to reference controller from a uitableviewcell class in Swift

I have the following


  1. ViewController

  2. tableView

  3. CustomCell



I used a NIB(an .xib file) for the cell, which uses a CustomCell class. This custom cell class handles IBAction for some touch on the cell's button. I'd like to reference the ViewController and some of its variables within it. How am I supposed to do it(accessing ViewController)?

Thanks!

Answer

I wouldn't create this kind of dependency between the cell and the view controller - that makes the architecture more intricate and the cell not reusable.

I suggest you to use the delegation pattern, which may sound a little complicated - although you're already using (UITableViewDelegate is a typical example):

  • create a protocol MyCellProtocol with one method didTapCell, accepting a UITableViewCell and/or some custom data you want to pass to the view controller
  • create a public delegate property in your custom cell: var cellDelegate: MyCellProtocol?
  • in the didTapXXX handler or didSelectRowAtIndexPath of your cell, call self.cellDelegate?.didTapCell(), passing the expected parameters
  • in your view controller, implement the MyCellProtocol
  • in cellForRowAtIndexPath of your view controller, when creating/dequeuing the cell, set its cellDelegate property to self

At this point, when a tap is done in your cell, the didTapCell method of the view controller is called, and from there you can do whatever you need to achieve.

The key point is: rather than making the cell handle the cell tap/selection, notify the view controller and let it do the job.