Неустранимая ошибка: индекс выходит за пределы диапазона при удалении ячейки из табличного представления rxswift - PullRequest
1 голос
/ 26 марта 2019

У меня простой просмотр таблицы.,Когда я хочу удалить ячейку из табличного представления, я получаю эту ошибку.

Просмотр кода контроллера :

class FoodCategoryDetailTableViewController: UITableViewController {
    var foodCategoryDetailViewModel: FoodCategoryDetailTableViewViewModelType?

    private let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()

        guard let foodCategoryDetailViewModel = foodCategoryDetailViewModel else { return }

        tableView.delegate = nil
        tableView.dataSource = nil

        foodCategoryDetailViewModel.foodsInSelectedCategory
            .bind(to: tableView.rx.items(cellIdentifier: FoodCategoryDetailTableViewCell.cellIdentifier, cellType: FoodCategoryDetailTableViewCell.self))
            { row, food, cell in
                cell.foodCategoryDetailCellViewModel = foodCategoryDetailViewModel.cellViewModel(forRow: row)
            }.disposed(by: disposeBag)

        tableView.rx.itemDeleted.subscribe({ [unowned self] indexPath in
            self.foodCategoryDetailViewModel?.removeFoodFromApplication(atRow: (indexPath.element?.row)!)
            self.tableView.reloadData()
        }).disposed(by: disposeBag)
    }

Просмотр кода модели :

class FoodCategoryDetailTableViewViewModel: FoodCategoryDetailTableViewViewModelType {
    var foodsInSelectedCategory: BehaviorRelay<[Food]>
    private var foodCategoryId: Int16

    func cellViewModel(forRow row: Int) -> FoodTableViewCellViewModelType? {
        if let food = getFood(atRow: row) {
            return FoodTableViewCellViewModel(foodModel: food)
        }
        return nil
    }

    func removeFoodFromApplication(atRow row: Int) {
        if let food = getFood(atRow: row) {
            var foods = foodsInSelectedCategory.value
            foods.remove(at: row)
            self.foodsInSelectedCategory = BehaviorRelay(value: foods)
            CoreDataHelper.sharedInstance.removeFoodFromApplication(foodName: food.name!)
        }
    }

    private func getFood(atRow row: Int) -> Food? {
        let food = foodsInSelectedCategory.value[row]

        return food
    }

    init(foodCategoryId: Int16) {
        self.foodCategoryId = foodCategoryId
        self.foodsInSelectedCategory = BehaviorRelay(value: CoreDataHelper.sharedInstance.fetchFoodsFromSelectedCategory(foodCategoryId: self.foodCategoryId))
    }
}

Я использую базовые данные.Я получаю ошибку в функции getFood().Это ошибка существует, потому что row в контроллере представления имеет старое количество элементов в табличном представлении.Он не обновляется с новым количеством продуктов (продуктов) после удаления ячейки.

...