Удаление ячеек TableView. Странный баг

uitableviewcell
coredata
swift3

#1

Привет.
При удалении данных из ячейки получаю такую ошибку:

[error] error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. attempt to delete row 2 from section 0 which only contains 2 rows before the update with userInfo (null)
CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. attempt to delete row 2 from section 0 which only contains 2 rows before the update with userInfo (null)

Я так понял - это связано с несоотвествием данных после update таблицы?

Получается, если у меня есть 2 ячейки. я удаляю одну. И вторую удалить уже не могу.


#2

а покажите метод удаления ячейки и на основе чего вы строите таблицу!


#3
  override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    let delete = UITableViewRowAction(style: .default, title: "Удалить") { (action, indexPath) in
        self.friends.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: .fade)
        
        if let context = (UIApplication.shared.delegate as? AppDelegate)?.coreDataStack.persistentContainer.viewContext{
            let objectToDelete = self.fetchResultsController.object(at: indexPath)
            context.delete(objectToDelete)
            
            do {
                try context.save()
            }catch {
                print(error.localizedDescription)
                
            }
            
        }
        
        
    }
    share.backgroundColor = #colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)
    delete.backgroundColor = #colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1)
    
    
    return [delete,share]
}

   }

На основе сущности из coreData. туда добавляю данные и оттуда беру.
Сильно глючит работа таблицы: если таблица и туда что-то добавить, то отображается не сразу. Только после повторного входа.
и ещё куча всего. В целом пофиксил, осталось пару штук.


#4

Вообще, не стоит так делать!
Из coreData стоит загрузить данные в массив, и в замыкании, когда закончится загрузка, обновить таблицу на основе этого массива!
С удалением такая же история: вы не должны удалять из таблицы данные в CoreData!Таблица это View Элемент, и она не должна знать про место хранения ваших данных!
Создайте себе функцию, в которую вы будете передавать indexPath.row той ячейки которую хотите удалить, функция на основе этого индекса и массива сможет удалить данные из coreData!


#5

Переписал через массив по вашему совету.
Насчет удаления:
Если я вас правильно понял - это может выглядеть так

 func deleteData(indexPath: IndexPath) {
        self.friends.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: .fade)
    

}

И дальше вызывать в методе editActionsForRowAt indexPath
?


#6
       func deleteData(indexPath: IndexPath) {
        self.friends.remove(at: indexPath.row)
}

Получилось! Удаляется как нужно.

  //  tableView.deleteRows(at: [indexPath], with: .fade)

Вот это было лишнее.

Спасибо огромное!!))


#7

Друзья, подскажите, пожалуйста…
Реализовал удаление ячейки из tableView и CoreData таким способом:

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {

    let appDelegete = UIApplication.shared.delegate as! AppDelegate 
    let context = appDelegete.persistentContainer.viewContext

    if editingStyle == .delete {
        self.tableV.setEditing(true, animated: true)

        context.delete(spendingArray.reversed()[indexPath.row])

        appDelegete.saveContext()


        do {
            spendingArray = try context.fetch(Spend.fetchRequest())
        }
        catch let error as NSError {
            print(error)
        }
        tableView.reloadData()
    }
}

Как изменить название у кнопки “Delete” на “Удалить”?