尝试为同一索引路径出列多个单元格,这是不允许的。错误

时间:2018-03-21 16:23:24

标签: ios swift uitableview

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)
    }
}

我真的不明白为什么会发生这种错误,有人可以帮我解决我的错误吗?

2 个答案:

答案 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)
    }
}

简单地强制投射细胞类型。如果您错误地设置了代码,它就会像使用guardfatalError一样崩溃。