Ramy Al Zuhouri
Ramy Al Zuhouri

Reputation: 21966

Failed to Load Custom Cell from dequeue reusable UITableViewCell

I am using xib file to create a custom cell. The reuse identifier is set up in the xib file. Then I have a lazy var that I use to register the nib only once:

private lazy var registerNib: Bool = {
    let nib = UINib(nibName: "CustomTableViewCell", bundle: nil)
    self.tableView.register(nib, forCellReuseIdentifier: "Custom")

    return true
}()

During Cell Creating I just used the lazy var and dequeue the cell from the table view, using the same reuse identifier that I have in the xib file:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let _ = self.registerNib
    let cell = tableView.dequeueReusableCell(withIdentifier: "Custom") as! CustomCell

    return cell
}

But the unwrapping fails and the app crashes.

tableView.dequeueReusableCell returns nil

for some reason....

Upvotes: 0

Views: 573

Answers (2)

OOPer
OOPer

Reputation: 47876

There are two methods named dequeueReusableCell.

But the unwrapping fails and the app crashes. tableView.dequeueReusableCell returns nil for some reason....

You are using the first one and the doc clearly says

Return Value

A UITableViewCell object with the associated identifier or nil if no such object exists in the reusable-cell queue.


You may want to use the latter. Change the line:

let cell = tableView.dequeueReusableCell(withIdentifier: "Custom") as! CustomCell

To:

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

Upvotes: 1

Faiz Fareed
Faiz Fareed

Reputation: 1548

You need to register your nib object in viewDidLoad(): method like this

let nib = UINib(nibName: "CustomTableViewCell", bundle: nil)

tableView.register(nib, forCellReuseIdentifier: "Custom")

Also, did you set the cell reuse identifier in the storyboard?

Upvotes: 0

Related Questions