tableView(canEditRowAt) 不再与 tableViewDiffableDataSource 一起工作

tableView(canEditRowAt) no longer working with tableViewDiffableDataSource

我创建了一个相当简单的 tableView 来为项目模型选择类别。昨天一切正常。今天我一直在尝试将 tableView 数据源切换到 UITableViewDiffableDataSource,因为我想把我的头绕在 API 周围。我备份了整个 tableView,运行 除了我不能再编辑我的行!

setEditing 逻辑工作,因为当我点击导航栏中的编辑按钮时 newCategoryButton 被禁用,当我再次点击它时它被启用。但是,我永远无法通过滑动来删除,并且在编辑模式下删除图标不会显示在我的行旁边。

我尝试删除 setEditing,清空 commit editingStyle 并简单地将 canEditRow 设置为 return true,但仍然没有。

如有任何帮助,我们将不胜感激。谢谢!

override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    let section = dataSource.snapshot().sectionIdentifiers[indexPath.section]
    if section == .noneSelected {
        return false
    } else {
    return true
    }
}

override func setEditing(_ editing: Bool, animated: Bool) {
    super.setEditing(editing, animated: true)
    if editing == true {
        newCategoryButton.isEnabled = false
    } else {
        newCategoryButton.isEnabled = true
    }
}

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        categories.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: .automatic)
    }
}

override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
    return true
}

override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
    let movedCategory = categories.remove(at: sourceIndexPath.row)
    categories.insert(movedCategory, at: destinationIndexPath.row)
}

screenShot after edit button is tapped

麻烦的是canEditRowAt是一个数据源方法。您(视图控制器)现在不是数据源;可区分的数据源是。您需要在 diffable 数据源 中实现此方法 。这通常是通过 subclassing diffable 数据源 class 来完成的,这样您就可以覆盖此方法。否则,diffable 数据源只是 returns 它的默认值 — 即 false,这就是您目前无法编辑任何行的原因。