func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "CollectionDetailsItem", for: indexPath) as? CharacterCollectionDetailsTableCell else {
fatalError("Dequeued cell is not an instance of CharacterDetailsTableViewCell class.")
}
return cell
}
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "CollectionDetailsItem", for: indexPath) as? CharacterCollectionDetailsTableCell else {
fatalError("Dequeued cell is not an instance of CharacterDetailsTableViewCell class.")
}
if let character = character {
cell.setCollectionViewDataSourceDelegate(dataType: dataTypes[indexPath.row], characterEntity: character)
}
}
我真的不明白为什么会发生这种错误,有人可以帮我解决我的错误吗?
答案 0 :(得分:2)
由于tableview
的数据源和委托方法的执行错误,您收到错误。 dequeueReusableCell
用于在tableview
中创建可重复使用的单元格。因此,它应该在tableview的cellForRow
dataSource方法中实现。你在第一种方法中做得很好,但这是你做错了。
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "CollectionDetailsItem", for: indexPath) as? CharacterCollectionDetailsTableCell else {
fatalError("Dequeued cell is not an instance of CharacterDetailsTableViewCell class.")
}
if let character = character {
cell.setCollectionViewDataSourceDelegate(dataType: dataTypes[indexPath.row], characterEntity: character)
}
}
此方法不是您可以创建单元格的地方,而是可以在显示单元格时根据要求执行各种任务。所以基于你的要求它可能就像这样......
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "CollectionDetailsItem", for: indexPath) as? CharacterCollectionDetailsTableCell else {
fatalError("Dequeued cell is not an instance of CharacterDetailsTableViewCell class.")
}
return cell
}
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if let cell = cell as? CharacterCollectionDetailsTableCell {
guard let character = character else {
return
}
cell.setCollectionViewDataSourceDelegate(dataType: dataTypes[indexPath.row], characterEntity: character)
}
}
感谢。
答案 1 :(得分:1)
错误是由于您在dequeueReusableCell
中滥用willDisplayCell
造成的。您只能在cellForRowAt
中使用它。
此外,该单元格已作为willDisplayCell
的参数提供给您。
更新至:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if let character = character {
let myCell = cell as! CharacterCollectionDetailsTableCell
myCell.setCollectionViewDataSourceDelegate(dataType: dataTypes[indexPath.row], characterEntity: character)
}
}
简单地强制投射细胞类型。如果您错误地设置了代码,它就会像使用guard
和fatalError
一样崩溃。