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

Core data 使用自定义按钮(CoreData)删除单元格项时应用程序崩溃,core-data,uicollectionview,swift4,ios12,swift4.2,Core Data,Uicollectionview,Swift4,Ios12,Swift4.2,当我从CollectionView中删除单元格时,应用程序崩溃(CoreData) 我正在使用CollectionView中的自定义按钮 var cardItems = [NSManagedObject]() cell.MenuButton.layer.setValue(indexPath.row, forKey: "index") cell.MenuButton.addTarget(self, action: #selector(MenuCell), for: UIControl.Event

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

编辑(它的工作)


您的数组
indexPaths
没有任何值。这是因为没有处于选定状态的集合视图项

可以按如下方式以编程方式选择第一个集合视图项:

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")
              }
     }
}

非常感谢。如何修复?我不需要只删除第一个单元格。我需要删除我在其中单击“删除”按钮的按钮,必须为您的按钮添加一个标记
cell.MenuButton.tag=indexPath.row
,然后在操作中传递您的按钮并像
let item=cardItems[sender.tag]
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")
              }
     }
}