强制解包可选导致崩溃

时间:2015-08-15 05:10:28

标签: swift

这种方法有问题;得到“致命错误:在解开可选值时意外发现nil”错误。

func configureCheckmarkForCell(cell: UITableViewCell, withChecklistItem item:ChecklistItem) {
    let label = cell.viewWithTag(1001) as! UILabel

    if item.checked {
        label.text = "√"
    } else {
        label.text = ""
    }
}

如何修复此问题以防止崩溃? 我有另一种类似的方法,并且具有一个可拆卸的力量,它不会造成麻烦:

func configureTextForCell(cell: UITableViewCell, withChecklistItem item:ChecklistItem) {
    let label = cell.viewWithTag(1000) as! UILabel
    label.text = item.text
}

3 个答案:

答案 0 :(得分:2)

崩溃的路线很明显:

add-money

崩溃有两个原因:

  • 该单元格没有带标签1001的视图
  • 标签1001的视图不是UILabel

请检查您的设计:

确保通过此方法传递的所有单元格都有一个标记为1001的关联视图,此视图为UILabel。

如果不可能,请使用Gerd Castan答案中描述的可选绑定

Swift语言鼓励开发人员在设计或编译时解决这些问题,通过删除所有可有可无的类型检查来使代码更高效

答案 1 :(得分:0)

尝试这样的事情:

func configureTextForCell(cell: UITableViewCell, withChecklistItem item:ChecklistItem) {

    if let view = cell.viewWithTag(1000) {
        if let label = view as? UILabel {
            label.text = item.text
        } else {
            print ("view is of type \(view.classForCoder)")
        }
    }

}

它不会崩溃,并会在你对你的课程的假设错误时告诉你。

答案 2 :(得分:0)

您可能已将标签放入错误的单元格(在故事板中)。如其他答案中所述,单元没有带有标记的视图

实施例: 如果您有一个带有“概览”单元格的视图和带有“详细视图”单元格的另一个视图,您可能已将标签放入“详细视图”,尽管它需要在“概述”中(反之亦然。)