pd jung
pd jung

Reputation: 59

ios swift making table list keep getting error about nill

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     let cell = tableView.dequeueReusableCell(withIdentifier: "cellReuseIdentifier") as! CustomTableViewCell

     let text = data[indexPath.row]

     cell.label.text = text

     return cell
}

above on is the code that I saw to follow.

my code is as below

enter image description here

I don't know why it getting nil value on tableView.dequeueReusableCell(withIdentifier: "locCell")

my storyboard is as below

enter image description here

I added identifier like below(you can see it on bottom-right section of pic

enter image description here

Upvotes: 0

Views: 79

Answers (4)

Ahmad F
Ahmad F

Reputation: 31645

Simply because tableView.dequeueReusableCell(withIdentifier: "cell") by default is nil.

It is the same case for any optional when trying to print it out, example:

let optionalString: String? = ""
print(optionalString)

leads to get:

enter image description here

So, by declaring a constant as:

let cell = tableView.dequeueReusableCell(withIdentifier: "cell")

since dequeueReusableCell(withIdentifier:) returns an optional UITableViewCell instance, the type of cell would be UITableViewCell? (optional UITableViewCell), that's why you are seeing this error.

How to get rid of it?

Assuming that you have set the cell right identifier for your cell:

enter image description here

Well, in case of having your custom cell, you could cast it as:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as? MyCustomCell else {
        // something goes wrong
        return UITableViewCell()
    }

    print(cell) // it would be fine for now

    // ...

    return cell
}

And if you don't have a custom cell, all you have to do is to remove the as? MyCustomCell down casting.

Upvotes: 1

Rupshikha anand
Rupshikha anand

Reputation: 65

  func  tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
      let cell = tableView.dequeueReusableCell(withIdentifier: "cellReuseIdentifier", for: indexPath) as! CustomTableViewCell
        cell.label.text = data[indexPath.row].name
        return cell
    }

NOTE: In your storyboard set tableView Delegate, DataSource and set cell ID cellReuseIdentifier.

Upvotes: 0

Rahul Dasgupta
Rahul Dasgupta

Reputation: 924

Replace

 let cell = tableView.dequeueReusableCell(withIdentifier: "locCell")

With this code:

 let cell = tableView.dequeueReusableCell(withIdentifier: "locCell", for: indexPath)

Upvotes: 0

Scriptable
Scriptable

Reputation: 19750

You need to register the cell for reuse.

tableView.register(LocationTableCell.self, forCellReuseIdentifier: "locCell")

Or enter your reuse identifier in the storyboard by selecting your cell and then entering the reuse identifier in the properties to the right.

Upvotes: 1

Related Questions