Выпуск
tableView.rx.itemDeleted
запускает событие, содержащее indexPath
, где произошло действие удаления. Изменение ваших данных должно быть обработано вами. Вы не получаете никаких обновлений, потому что вы ничего не меняете, вы просто печатаете indexPath
.
Решение
Поскольку вы используете viewModel.getUsers()
, который возвращает вам Observable<[SectionModel<String, User>]>
, исходя из вашего кода. Вам также следует ввести метод для viewModel
, который будет использоваться для удаления элемента с определенной indexPath
.
Чтобы достичь этого, вам нужно иметь хранилище ваших элементов в BehaviorSubject
. Это будет содержать текущее значение данных, и при обновлении оно будет отправлять новые данные тем, которые подписались на него.
let sectionListSubject = BehaviorSubject(value: [SectionModel<String, User>]())
Когда вы инициализируете ваш viewModel
, вам нужно заполнить эту тему данными, сделав так:
sectionListSubject.onNext([
SectionModel(model: "First section", items: [
User(),
User(),
User()
]),
SectionModel(model: "Second section", items: [
User(),
User(),
User()
])
])
Тогда ваш getUsers()
метод должен выглядеть следующим образом:
func getUsers() -> Observable<[SectionModel<String, User>]> {
return sectionListSubject.asObservable()
}
Последний шаг на вашем viewModel
, это реализация removeItem(at:)
func removeItem(at indexPath: IndexPath) {
guard var sections = try? sectionListSubject.value() else { return }
// Get the current section from the indexPath
var currentSection = sections[indexPath.section]
// Remove the item from the section at the specified indexPath
currentSection.items.remove(at: indexPath.row)
// Update the section on section list
sections[indexPath.section] = currentSection
// Inform your subject with the new changes
sectionListSubject.onNext(sections)
}
Теперь, когда у вас есть кодовая база, вам просто нужно изменить:
tableView.rx.itemDeleted
.subscribe(onNext: { self.viewModel.removeItem(at: $0) })
.disposed(by: disposeBag)
Удаление должно работать.