从选定索引处的表视图中的数组中删除

Posted

技术标签:

【中文标题】从选定索引处的表视图中的数组中删除【英文标题】:Delete from array in a tableview at the selected index 【发布时间】:2020-09-01 13:04:23 【问题描述】:

我正在尝试删除我正在使用对象数组呈现的表格视图中的一行。我在角落添加了一个删除按钮,点击它应该删除选定的行,但无论我点击哪一行,它总是删除第一行。

我先声明了一个变量:private var indexForCell = Int() 然后我像这样使用tableview方法didSelectRowAt

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        indexForCell = indexPath.row
    

然后我使用我添加的按钮进行删除:

    @IBAction func removePokemon(_ sender: UIButton) 
        favourites.remove(at: indexForCell)
        self.tableView.reloadData()
    

这会使行删除,但始终是第一个。无论我选择哪一行,它都会删除第一行。我怎样才能阻止这种情况?

【问题讨论】:

查看这里如何删除表格视图中的行。 ***.com/a/52818024/7905888 您应该更新您的问题,以明确您在每个表格视图单元格上都有一个删除按钮,并且您希望能够点击该按钮并让它删除该特定单元格。如果是这种情况,您在用户选择单元格时保存单元格索引的方法将不起作用,因为您可以在不先选择单元格的情况下点击单元格上的按钮。 发布问题时,您需要详细描述情况,以便读者完全理解。您的问题与书面内容一样模糊且不完整。我会推迟对它投反对票,但它需要改进。 【参考方案1】:

代码行private var indexForCell = Int() 是一个等待发生的错误。 Int() 解析为零,代表第一行。因此,如果您从不选择一行,它将尝试删除第一行。

将变量设为可选:

private var indexForCell = Int?

然后重写你的删除函数:

@IBAction func removePokemon(_ sender: UIButton) 
    guard let indexToRemove = indexForCell else 
        print("No index selected")
        return
    
    favourites.remove(at: indexToRemove)
    self.tableView.reloadData()

但是你没有告诉我们你的favourites.remove(at:) 函数做了什么,你也没有告诉我们你是如何填充你的表格视图的,所以很难判断是否还有其他问题。

(顺便说一句,与重新加载整个表格视图相比,删除单个单元格的方法更好,但现在让我们专注于让您当前的方法正常工作。)

编辑:

如果您在每个单元格上都有一个删除按钮,您想删除该项目而不选择它,您需要一种方法来确定哪个单元格包含该按钮。我写了一个表格视图扩展,可以让你弄清楚。见此链接:https://***.com/a/42043277/205185

【讨论】:

这有点工作!至少我现在可以删除任何行,无论它位于什么索引,但有一个小问题。我必须选择该行才能删除它。当我单击在单元格中创建的按钮时,它会打印“未选择索引”,但是当我单击单元格本身然后单击按钮时,它会删除该单元格。我必须选择单元格,然后单击单元格上的按钮将其删除。我希望它在按下按钮时直接删除而不选择行 每个单元格上都有删除按钮吗?如果是这样,您需要确定在您的操作代码中哪个单元格包含按钮。使用按钮的 frame.origin(转换为表格视图的坐标)来确定哪个单元格包含按钮。我写了一个表格视图扩展,它可以让你找出哪个索引路径包含一个视图,并在 SO 上发布了它。我会尽力为您找到链接。

以上是关于从选定索引处的表视图中的数组中删除的主要内容,如果未能解决你的问题,请参考以下文章

表从数组中删除索引路径行值

来自数组索引的表视图超出范围

数据库中的视图索引

根据选定的表视图行更新 UILabel

从Django中的GET参数中提取带有索引的数组

SQL语言中所说的视图具体是啥意思?他与基本表,索引有何关系?举例说明