I have simple tableview. . When I want to delete cell from table view, I get that error.
View controller code:
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)
}
View Model code:
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))
}
}
I am using Core Data. I get error in function getFood(). It error exist because row in view controller have old count of items in tableview. It is not updating with new count of items (foods) after delete cell.