Сбой приложения при удалении элемента ячейки с помощью пользовательской кнопки (CoreData) - PullRequest
0 голосов
/ 27 ноября 2018

Когда я удаляю ячейку из моего приложения CollectionView, происходит сбой (CoreData).

Я использую пользовательскую кнопку в CollectionView.

var cardItems = [NSManagedObject]()

cell.MenuButton.layer.setValue(indexPath.row, forKey: "index")
cell.MenuButton.addTarget(self, action: #selector(MenuCell), for: UIControl.Event.touchUpInside)

Ошибка

enter image description here

РЕДАКТИРОВАТЬ (это работа)

let i: Int = (sender.layer.value(forKey: "index")) as! Int

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
let managedContext = appDelegate.persistentContainer.viewContext

let indexPath = IndexPath(item: i, section: 0)
let itemToDelete = self.cardItems[indexPath.item]
self.cardItems.remove(at: indexPath.item)
managedContext.delete(itemToDelete)
appDelegate.saveContext()

self.collectionView.reloadData()

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Прежде всего, это не очень хороший способ определить кнопку нажатия.Вместо этого вы можете установить тег кнопки как indexPath.row, как показано ниже:

menuButton.tag = indexPath.row
cell.MenuButton.layer.setValue(indexPath.row, forKey: "index")

Также улучшите свои навыки кодирования, см. Ниже:

cell.MenuButton.addTarget(self, action: #selector(onClickMenuButton(_:)), for: .touchUpInside)

Реализуйте этот селектор как:

let i: Int = (sender.layer.value(forKey: "index")) as! Int

func onClickMenuButton(_ sender: UIButton) {
    let task = self.cardItems[sender.tag]
       if let managedContext = task.managedObjectContext {
              managedContext.delete(task)
              do {
                 try managedContext.save()
                 self.cardItems.remove(at: sender.tag)
                 let indexPath = IndexPath(row: i, section: 0)
                 self.collectionView.deleteItems(at: [indexPath])
              } catch {
                 print("Failed to delete")
              }
     }
}
0 голосов
/ 27 ноября 2018

Ваш массив indexPaths не имеет никакого значения.Это связано с тем, что нет элементов представления коллекции, которые находятся в выбранном состоянии

Первый элемент представления коллекции можно программно выбрать следующим образом:

let indexPath = collectionView.indexPathsForSelectedItems?.first ?? IndexPath(item: 0, section: 0)
    self.collectionView.selectItem(at: indexPath, animated: false, scrollPosition: UICollectionView.ScrollPosition.centeredHorizontally)
...