Core data 使用自定义按钮(CoreData)删除单元格项时应用程序崩溃
当我从CollectionView中删除单元格时,应用程序崩溃(CoreData) 我正在使用CollectionView中的自定义按钮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
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")
}
}
}