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

时间:2018-11-27 05:37:23

标签: 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.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 :(得分:1)

您的数组indexPaths没有任何值。这是因为没有处于选中状态的收藏夹视图项

您可以通过编程方式选择第一个收藏夹视图项,如下所示:

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

答案 1 :(得分:1)

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