как только у нас будет более 2 записей в coredata, если бы я использовал опцию поиска и выбрал отель из поиска, go на страницу рейтингов отеля и выберите смайлик, приложение вылетает, давая ошибку ниже
attempt to delete row 1 from section 0 which only contains 1 rows before the update'
Важные файлы,
RestaurantMainController в группе контроллеров - весь штрих-код поиска вспомогательная функция строка 343 и далее, другой код в просмотреть didload строка 106 и далее
DetailViewController в папке контроллера, строка 162 , как перейти к рейтингам ресторанов
RatingsViewController строка 44 , здесь, если я удалю
self.restaurant.rating = rating
at строку 50 , все в порядке, иначе я получаю сообщение об ошибке
Приложение работает хорошо, если я не использую панель поиска, но как только я использую панель поиска и обновляю рейтинги, приложение теряет
Код для добавления / обновления
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
restaurantMainTable.beginUpdates()
}
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
switch type {
case .insert:
if let newIndexPath = newIndexPath {
restaurantMainTable.insertRows(at: [newIndexPath], with: .fade)
}
case .delete:
if let indexPath = indexPath {
restaurantMainTable.deleteRows(at: [indexPath], with: .fade)
}
case .update:
if let indexPath = indexPath {
restaurantMainTable.reloadRows(at: [indexPath], with: .fade)
}
default:
restaurantMainTable.reloadData()
}
if let fetchedObjects = controller.fetchedObjects {
restaurants = fetchedObjects as! [Restaurant]
}
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
restaurantMainTable.endUpdates()
}
@objc func addRatings(_ sender: UIButton) {
let detailReturn = DetailViewController()
if let rating = sender.titleLabel?.text {
self.restaurant.rating = rating
if let appDelegat = (UIApplication.shared.delegate as? AppDelegate) {
appDelegat.saveContext()
}
}
detailReturn.restaurant = restaurant
self.navigationController?.pushViewController(detailReturn, animated: false)
}
cellforRowAt
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = restaurantMainTable.dequeueReusableCell(withIdentifier: String(describing: RestaurantMainViewCells.self), for: indexPath) as! RestaurantMainViewCells
let restaurant = (searchControlInstance.isActive) ? searchResults[indexPath.row] : restaurants[indexPath.row]
cell.restaurantName.text = restaurant.name
cell.restaurantType.text = restaurant.type
cell.restaurantLocation.text = restaurant.location
if restaurant.isVisited == true {
cell.restaurantHeartImage.image = UIImage(named: "heart-tick")
}
else {
cell.restaurantHeartImage.image = nil
}
if let restaurantImage = restaurant.image {
cell.restaurantMiniImage.image = UIImage(data: restaurantImage as Data)
}
return cell
}
РЕШЕНИЕ
Итак, проблема была такова, я набираю что-то в поле поиска, и результат поиска будет отображаться на основе функций фильтра, которые вставляют совпадающие записи в массив, теперь, если я нажимаю на любой результат и перехожу на следующую страницу и делаю изменения, изменения происходят
Если я теперь прослежу свой путь, я увижу те же результаты, показывающие, которые я нашел при вводе поискового запроса, представление таблицы необходимо обновить здесь до исходного состояния, из которого он выбрал поиск результаты, если нет, это приведет к этой ошибке
Итак, я добавил searchControlInstance.isActive = false
после того, как я щелкнул поисковый запрос и перешел к следующему представлению в rowdidselect, это гарантирует, что ошибка исчезла
кредитов - purebreadd