Matt
Matt

Reputation: 2350

Why is my tableView not being populated?

I'm trying to populate a basic tableview with sample data in code. Here's my ViewController:

import UIKit

class TableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var postTableView: UITableView!

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 4
    }

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

        cell.textLabel?.text = "title"
        cell.detailTextLabel?.text = "detail"
        return cell
    }
}

Here is my storyboard enter image description here

I'm sure that the name "postcell" is correct and that I've hooked up the tableView to the ViewController as a datasource and delegate.

When I run the code in the iOS simulator, no cells show up. This is what I see:

enter image description here

Here are the constraints on my stack view enter image description here

stack view properties

enter image description here enter image description here

I don't want to use UITableViewController

How do I get the table cells to appear?

Upvotes: 1

Views: 420

Answers (3)

Matt
Matt

Reputation: 2350

Thank you @MrSaturn for pointing out in the comments that it's a problem with the stack view. In storyboard I had to change the stack view's alignment property from center to Fill.

Upvotes: 1

V-Dev
V-Dev

Reputation: 508

in tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)

let cell = tableView.dequeueReusableCell(withIdentifier: "postcell", for: indexPath) as postcell // add this line

Upvotes: 1

gwinyai
gwinyai

Reputation: 2580

If "postcell" is not a prototype cell from your storyboard, you need to register it in your viewDidLoad:

    postTableView.register(UITableViewCell.self, forCellReuseIdentifier: "postcell")

If it is a XIB table view cell you would register it as follows:

    postTableView.register(UINib(nibName: "NibName", bundle: nil), forCellReuseIdentifier: "postcell")

If you were to do it from storyboard, drag a prototype cell (or table view cell) onto your table view and in the reuse identifier call it "postcell" as shown here:

Prototype table view cell

Make sure you have also done the following in your viewDidLoad:

    postTableView.delegate = self
    postTableView.dataSource = self

Of course, you'll also need:

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

Upvotes: 2

Related Questions