【问题标题】:App crash when delete cell Item with custom Button (CoreData)使用自定义按钮(CoreData)删除单元格项目时应用程序崩溃
【发布时间】:2019-04-28 19:43:25
【问题描述】:

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

【问题讨论】:

  • 只需为您的按钮添加标签cell.MenuButton.tag = indexPath.row,然后在您的操作中传递您的按钮并读取let item = cardItems[sender.tag]

标签: core-data uicollectionview swift4 ios12 swift4.2


【解决方案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")
              }
     }
}

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢。如何解决?
    • 我不需要只删除第一个单元格。我需要删除我点击“删除”按钮的那个
    猜你喜欢
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多