使用自定义按钮 (CoreData) 删除单元格项目时应用程序崩溃

App crash when delete cell Item with custom Button (CoreData)

当我从 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)

错误

编辑(有效)

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()

您的数组 indexPaths 没有任何值。这是因为没有处于 selected 状态

的集合视图项

您可以按如下方式select 以编程方式查看第一个集合视图项目:

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

首先,这不是识别点击按钮的好方法。相反,您可以将按钮标签设置为 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")
              }
     }
}