我正在制作一个简单的待办事项清单应用程序。我创建了一个自定义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
}
}
答案 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函数(该函数是表格视图,它具有强大的功能,可以告诉您表格视图单元已完成其加载,并且将要显示的是,在以这种方式显示表格之前,您还需要更改其中的任何内容,您可以确保一切都构建良好而且没有指甲