展开可选包时意外发现nil但变量具有值

时间:2018-08-10 19:08:43

标签: ios swift uitableview

我正在制作一个简单的待办事项清单应用程序。我创建了一个自定义tableviewcell,其中包含标签和textview。标签用于标题,textview用于描述。当我尝试运行该应用程序时,它崩溃并给我以下错误:

  

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

错误被抛出:

cell.taskTitle.text = task.title

,但是上面一行的打印语句将打印出"Optional("Task 1")"。 为什么会这样?

这是整个功能:

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

    let task = taskList[indexPath.row]
    print(task.title)
    cell.taskTitle.text = task.title
    cell.taskDescription.text = task.description

    return cell
}

谢谢!

编辑: 我的taskList全局声明为:

var taskList: [Task] = [
    Task(title: "Task 1", desc: "Task 1 desc"),
    Task(title: "Task 2", desc: "Task 2 desc"),
    Task(title: "Task 3", desc: "Task 3 desc")
]

我的任务班:

class Task {
var title: String?
var description: String?

init(title: String, desc: String) {
    self.title = title
    self.description = desc
}

}

2 个答案:

答案 0 :(得分:3)

这是因为您在错误的位置查看。 nil不是task.title。是cell.taskTitle

当然,现在您可能想知道为什么。这是因为您配置的单元出队机制不正确。您没有显示自己的操作方式,因此我们不得不猜测。这里的常见错误是呼叫

tableView.register(TaskTableViewCell.self...

这实际上会防止从情节提要或xib文件中加载您的单元,因此您所有单元的出口都是nil。如果您的代码中有这样一行,那么:

  • 如果单元是在情节提要板上设计的,请删除该行。

  • 如果您的单元格是在xib文件中设计的,则将该行替换为:

    tableView.register(UINib(nibName:"TaskTableViewCell", bundle:nil)...
    

答案 1 :(得分:1)

首先,如果您使用“ po”之类的命令来显示每个变量的值以查看其是否已创建,将是更好的选择;其次,在使用willdispaly函数(该函数是表格视图,它具有强大的功能,可以告诉您表格视图单元已完成其加载,并且将要显示的是,在以这种方式显示表格之前,您还需要更改其中的任何内容,您可以确保一切都构建良好而且没有指甲