Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Custom cell: fatal error: unexpectedly found nil while unwrapping an Optional value

Tags:

swift

iphone

ios7

I have a table view with custom cell that was created as .xib . I didnt use storyboard. I have a problem that I couldnt fill my table with the data which came from webservice result. Also, I have 4 labels in the custom cell. In my custom cell class, when I try to set labels for each items, It gives me fatal error like above.

Here is my code:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
...

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!
{
        let cell: ItemManagementTVCell = tableView?.dequeueReusableCellWithIdentifier("cell") as ItemManagementTVCell

    if let ip = indexPath
    {
        let item: Item = self.itemList[indexPath.row] as Item
        cell.setCell(item.itemName, status: item.itemStatus, duration: item.itemDuration, price: item.itemPrice)
    }
    return cell
}
}

And my custom cell class is here :

import UIKit

class ItemManagementTVCell: UITableViewCell {

    @IBOutlet var lblItemName: UILabel!
    @IBOutlet var lblItemPrice: UILabel!
    @IBOutlet var lblItemDuration: UILabel!
    @IBOutlet var lblItemStatus: UILabel!

    override func awakeFromNib()
    {
        super.awakeFromNib()
    }

    override func setSelected(selected: Bool, animated: Bool)
    {
        super.setSelected(selected, animated: animated)
    }

    func setCell(name: String, status: Int, duration: Int, price: Int)
    {
        self.lblItemName.text     = name
        self.lblItemStatus.text   = String(status)
        self.lblItemDuration.text = "Duration: \(String(duration)) months"
        self.lblItemPrice.text    = String(price) + " $"
    }
}

I am getting the error inside of "setCell" method block.

I have read a lot of questions and solutions and I tried all of them it doesnt work for me.

Thank you for your answers,

Best regards.

SOLUTION: I've solved this problem by linking the cell items to cell's own instead of linking to File's Owner. My problem has gone by doing this.

like image 606
serhanaksut Avatar asked Aug 29 '14 13:08

serhanaksut


2 Answers

Another solution to the problem without having to link cell items to the cell owner:

let nib = UINib(nibName: "YOUR_CUSTOM_CELL_NIB_NAME", bundle: nil)
tableView.register(nib, forCellReuseIdentifier: "YOUR_CUSTOM_CELL_ID")
like image 181
Lawliet Avatar answered Nov 02 '22 23:11

Lawliet


Your "cell" must be nil.

Using

tableView.dequeueReusableCellWithIdentifier("cell") as ItemManagementTVCell

Can return nil. You should use:

tableView.dequeueReusableCellWithIdentifier("cell" forIndexPath:indexPath) as ItemManagementTVCell

This way it guarantees cells is not nil.

EDIT: Maybe you can prevent the crash by putting if statements inside "setCell"

if var itemName = self.lblItemName {
    itemName.text = name
}

Do that for every label you set inside it and check if the crash still happens. If it don't you must check why those labels are nil.

like image 44
Thiago Magalhaes Avatar answered Nov 03 '22 00:11

Thiago Magalhaes