自定义单元格:致命错误:在展开可选值时意外发现 nil

Posted

技术标签:

【中文标题】自定义单元格:致命错误:在展开可选值时意外发现 nil【英文标题】:Custom cell: fatal error: unexpectedly found nil while unwrapping an Optional value 【发布时间】:2014-08-29 13:39:16 【问题描述】:

我有一个表格视图,其中包含创建为 .xib 的自定义单元格。我没有使用故事板。我有一个问题,我无法用来自 web 服务结果的数据填充我的表。另外,我在自定义单元格中有 4 个标签。在我的自定义单元格类中,当我尝试为每个项目设置标签时,它给了我上面的致命错误。

这是我的代码:

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


我的自定义单元类在这里:

导入 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) + " $"
    

我在“setCell”方法块中遇到错误。

我已经阅读了很多问题和解决方案,我尝试了所有这些对我不起作用。

感谢您的回答,

最好的问候。

解决方案:我已经通过将单元格项目链接到单元格自己的而不是链接到文件所有者来解决了这个问题。我的问题已经解决了。

【问题讨论】:

你能在这里添加解决方案吗? 这很简单,我将逐步解释它 1-) 单击您的单元格 2-) 单击位于右侧“隐藏或显示实用程序”菜单中的连接检查器。 3-) 单击文件的所有者,如果有任何连接的项目,将其全部删除。然后单击单元格视图并在那里连接您的单元格项目。注意:我没有使用故事板。此解决方案适用于 xibs。 @neosergio 感谢您的澄清 我遇到了类似的问题,这段代码得到“致命错误,意外发现为零”。但这很疯狂,因为如果我插入... print(indexPath) print(tableView) 我可以清楚地看到两者都不是零。更糟糕的是,这是一个间歇性问题。有时有效,有时无效。 【参考方案1】:

无需将单元格项目链接到单元格所有者的另一个解决方案:

let nib = UINib(nibName: "YOUR_CUSTOM_CELL_NIB_NAME", bundle: nil)
tableView.register(nib, forCellReuseIdentifier: "YOUR_CUSTOM_CELL_ID")

【讨论】:

【参考方案2】:

您的“单元格”必须为零。

使用

tableView.dequeueReusableCellWithIdentifier("cell") as ItemManagementTVCell

可以返回零。你应该使用:

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

这样可以保证单元格不为零。

编辑:也许您可以通过将 if 语句放入“setCell”中来防止崩溃

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

对您在其中设置的每个标签执行此操作,并检查崩溃是否仍然发生。如果不是,您必须检查为什么这些标签为零。

【讨论】:

你能在 setCell 块中放一个断点并检查里面是否有“nil”吗? 我认为问题与标签有关,因为当我初始化标签时,它没有抛出任何异常,但tableview中没有任何项目。它是空的。是否有任何与标签相关的错误? 我用可能的解决方案编辑了答案。请检查一下。 我试过了,还是不行:(谢谢你的回答。 检查这些链接,看看是否有帮助:***.com/questions/24643522/…***.com/questions/24715343/…

以上是关于自定义单元格:致命错误:在展开可选值时意外发现 nil的主要内容,如果未能解决你的问题,请参考以下文章

removeFromSuperView() 和单元格 = 致命错误:在展开可选值时意外发现 nil

致命错误:在展开可选值时意外发现 nil (cellForRowAtIndexPath) (Xib Custom Cell Swift)

UITableViewCell 中的 AVPlayer 导致“在隐式展开可选值时意外发现 nil”错误

在 SWIFT 3.0 中展开可选值时意外发现 nil

CollectionView 致命错误:在展开可选值时意外发现 nil

Swift 1.2:致命错误:在展开可选值时意外发现 nil