Удалить запись в Core Data с CollectionView - PullRequest
0 голосов
/ 30 сентября 2018

Я хотел бы удалить запись в Базовых данных, когда вы нажимаете на кнопку закрытия в ячейке CollectionView.Я сделал UIButton в контроллере ячейки Collection Collection с расширением в файле контроллера CollectionView.

IndexPath дает число, и я сделал let deleteCellNumber, но я получил ошибку:

'Невозможно преобразовать значение типа' IndexPath.Element (aka 'Int') в ожидаемый тип аргумента 'NSManagementObject'

extension soundboardVC: SoundboardCellDelegate {
    func delete(cell: soundboardCellVC) {

        if let indexPath = collectionView?.indexPath(for: cell) {

            let soundRequest:NSFetchRequest<Soundboard> = Soundboard.fetchRequest()
            let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
            let deleteCellNumber = indexPath[1]

            context.delete(deleteCellNumber)

            (UIApplication.shared.delegate as! AppDelegate).saveContext()

            do {
                soundBoardData = try managedObjectContext.fetch(soundRequest)
            } catch {
                print("Fetching Failed")
            }
        }
    }
}

1 Ответ

0 голосов
/ 30 сентября 2018

Ошибка очень очевидна:

context.delete(... ожидает экземпляр NSManagedObject, но вы передаете целое число (кстати, indexPath[1] - довольно жуткий, но правильный способ получить item /row значение).

Предполагается, что у вас есть массив источника данных soundBoardData. Обычный способ удаления объектов Core Data в представлении коллекции или таблицы:

extension soundboardVC: SoundboardCellDelegate {
    func delete(cell: soundboardCellVC) {

        if let indexPath = collectionView?.indexPath(for: cell) {

            let appDelegate = UIApplication.shared.delegate as! AppDelegate
            let context = appDelegate.persistentContainer.viewContext
            let itemToDelete = soundBoardData[indexPath.item]
            soundBoardData.remove(at: indexPath.item)
            context.delete(itemToDelete)
            collectionView!.deleteItems(at: indexPath)
            appDelegate.saveContext()
        }
    }
}

Не выполнять повторное получениеданные, удалите элемент в массиве источника данных, затем удалите элемент в контексте управляемого объекта, удалите строку из представления коллекции (с анимацией) и сохраните контекст.

...