Приложение вылетает при редактировании записи, выбранной через панель поиска - PullRequest
0 голосов
/ 04 августа 2020

как только у нас будет более 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...