akash23a
akash23a

Reputation: 127

UITableViewCell data not showing up in UITableViewController

I am having trouble debugging why my UITableview cell data isn't showing up in the UITableview. The UITableview currently displays blank when the user navigates to it. Data is correctly going into the cellForRowAt and into the function that sets the cell data.

Setting the cell data

class EventInboxTableViewCell: UITableViewCell {

@IBOutlet weak var eventNameLabel: UILabel!
@IBOutlet weak var eventCoverImageView: UIImageView!
@IBOutlet weak var eventStartLabel: UILabel!
@IBOutlet weak var eventEndLabel: UILabel!

var eventStartString = String()
var eventEndString = String()

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
}

func setEvent(_ event:Event) {

    eventNameLabel?.text = event.eventName

    if event.eventStart != nil {
        let eventStartTS = event.eventStart
        let eventStartDate = eventStartTS?.dateValue()
        self.eventStartString = AppWideService.dateToStringShort(date: eventStartDate!)
    }

    if event.eventEnd != nil {
        let eventEndTS = event.eventEnd
        let eventEndDate = eventEndTS?.dateValue()
        self.eventEndString = AppWideService.dateToStringShort(date: eventEndDate!)
    }

    print("Event inbox event \(eventStartString)")
    print("Event inbox event \(eventEndString)")

    eventStartLabel?.text = self.eventStartString
    eventEndLabel?.text = self.eventEndString

    guard let urlString = event.eventCoverUrl as? String else { return  }
    let url = URL(string: urlString)
    guard url != nil else {
        //Couldn't create url object
        return
    }
    eventCoverImageView?.sd_setImage(with: url) { (image, error, cacheType, url) in
        self.eventCoverImageView?.image = image
    }}}

For some reason when I remove the ? from setting the label text it says the values like eventName or eventStartString etc are nil, but I have print statements that ensure they are not.

UITableView Datasource

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return retrievedEvents.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "EventInboxTableViewCell", for: indexPath) as! EventInboxTableViewCell

    let event = retrievedEvents[indexPath.row]

    cell.setEvent(event)

    return cell
}

Registered the cell in viewDidLoad

tableView.register(EventInboxTableViewCell.self, forCellReuseIdentifier: "EventInboxTableViewCell")

Upvotes: 0

Views: 43

Answers (1)

DonMag
DonMag

Reputation: 77690

The problem is the way the table view controller was being used.

If you design a View Controller (of any type) in Storyboard, and you want to use it, you cannot simply say:

let vc = EventInboxTableViewController()

you have to instantiate it from the storyboard:

if let vc = storyboard?.instantiateViewController(withIdentifier: "EventInboxTableViewController") as? EventInboxTableViewController {
    navigationController?.pushViewControllerFromLeft(controller: vc)
}

So, in Storyboard, assign your custom class to your UITableViewController, and make sure to fill in the Storyboard ID field (with the string you are using in code as the Identifier).

Upvotes: 1

Related Questions