我正在制作一个简单的待办事项列表应用程序。我创建了一个带有标签和textview
的自定义tableviewcell
。标签用于标题,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
}
谢谢!
编辑: 我的任务列表全局声明为:
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
}
}
这是因为你找错了地方。nil
的不是task.title
.这是cell.taskTitle
.
当然,现在你可能想知道为什么会这样。这是因为您未正确配置单元出列机制。你没有展示你是如何做到这一点的,所以我们必须猜测。这里一个常见的错误是调用
tableView.register(TaskTableViewCell.self...
这实际上会阻止您的单元格从情节提要或 xib 文件加载,因此您的单元格的所有出口都nil
。如果你的代码中有这样的一行,那么:
如果单元格是在情节提要中设计的,请删除该行。
如果您的单元格是在 xib 文件中设计的,请将该行替换为:
tableView.register(UINib(nibName:"TaskTableViewCell", bundle:nil)...
首先,如果您使用一些命令(如"po"(来显示每个变量的值以查看它是否已创建,那就更好了 其次,我在 我使用了 willdispaly 函数,它是表视图的属性,它有很大的力量 它告诉你嘿,表视图单元格完成了加载,即将显示 还有什么您想在以这种方式显示它之前对其进行更改,您确定一切都构建良好且没有 nils