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.