tableView(canEditRowAt) больше не работает с tableViewDiffableDataSource

Я создал довольно простой tableView для выбора категории для модели элемента. Вчера все работало нормально. Сегодня я пытался переключить источник данных tableView на UITableViewDiffableDataSourceтак как я хочу обдумать API. У меня есть резервная копия и работает весь tableView, КРОМЕ Я больше не могу редактировать свои строки!

логика работает как 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 после нажатия кнопки редактирования

1 ответ

Решение

Беда в том, что canEditRowAtэто метод источника данных . Вы (контроллер представления) теперь не являетесь источником данных; доступный источник данных -. Вам необходимо реализовать этот метод внутри источника данных, доступного для просмотра . Обычно это делается путем создания подкласса от класса источника данных, доступного для сравнения, чтобы вы могли переопределить этот метод. В противном случае источник данных для различий просто возвращает свое значение по умолчанию, то есть false, поэтому в настоящее время вы не можете редактировать никакие строки.

Другие вопросы по тегам