崩溃:试图使同一索引路径的多个单元格出列,这是不允许的

Crash: Attempted to dequeue multiple cells for the same index path, which is not allowed

我有 tableview 数据源函数来从工厂方法函数构建单元格。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        return OWTableViewOrganizer.instance.configureCell(at: indexPath)!
    }

工厂方法在这里:

func configureCell(at indexPath: IndexPath) -> UITableViewCell? {
 
        var cell = UITableViewCell()
        
        switch indexPath.section {
        case thisWorkoutSections.barbel.sectionNumber():
            cell = barebellCell(indexPath: indexPath)
            break
        case thisWorkoutSections.lastWorkout.sectionNumber():           
            cell = lastWorkoutCell(indexPath: indexPath)
            break
        case thisWorkoutSections.personalRecord.sectionNumber():
            cell = personalRecordCell(indexPath: indexPath)
            break
        case thisWorkoutSections.notes.sectionNumber():
            
            break
        default:
            break
        }
        
        return cell
    }

我有这个代码来构建单元格:

func lastWorkoutCell(indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: WorkoutSetTableViewCell.cellIdentifier(), for: indexPath) as! WorkoutSetTableViewCell
        
        if OWTableViewOrganizer.instance.lastWorkoutExerciseSets.count > 0 {
            if indexPath.row < OWTableViewOrganizer.instance.lastWorkoutExerciseSets.count {
                let logExerciseSet = OWTableViewOrganizer.instance.lastWorkoutExerciseSets[indexPath.row]
                let setNumber = indexPath.row + 1
                if let weight = logExerciseSet.weight?.doubleValue, let reps = logExerciseSet.reps?.intValue {
                    cell.setupCellWithData(setNumber: setNumber, weight: weight, reps: reps)
                }
            } else {
                cell.setupCellWithData(setNumber: -1, weight: 0, reps: 0)
            }
        } else {
            cell.setupCellWithData(setNumber: -1, weight: 0, reps: 0)
        }
        
        return cell
    }

但这条线时常让我崩溃:

let cell = tableView.dequeueReusableCell(withIdentifier: WorkoutSetTableViewCell.cellIdentifier(), for: indexPath) as! WorkoutSetTableViewCell

有错误:

Attempted to dequeue multiple cells for the same index path, which is not allowed. If you really need to dequeue more cells than the table view is requesting, use the -dequeueReusableCellWithIdentifier: method (without an index path)

我知道这里的代码风格和设计不太理想,有意见请跳过

我不知道去哪里找,我试过简单地删除 indexPath,但它看起来没有帮助或带来更多问题:

let cell = tableView.dequeueReusableCell(withIdentifier: WorkoutSetTableViewCell.cellIdentifier()) as! WorkoutSetTableViewCell

我有一个控制器在它的顶部显示另一个控制器(就像在 Apple music 中一样),我可以向下滑动以显示底部控制器并向上滑动以恢复顶部控制器。我在日志中注意到我有一些演示警报,不确定是否需要处理以解决上述问题,但 JFY 信息。

好像有两个table查看触发器

tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)

并且您只从 1 table 视图

中取出单元格
let cell = tableView.dequeueReusableCell(withIdentifier: WorkoutSetTableViewCell.cellIdentifier(), for: indexPath) as! WorkoutSetTableViewCell

你应该尝试通过 tableView

tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)

lastWorkoutCell(indexPath: IndexPath)

(将变为 lastWorkoutCell(indexPath: IndexPath, tableView: UITableView))并从 tableView

中取出单元格