从 Tableview 的第 0 部分中删除按钮

Posted

技术标签:

【中文标题】从 Tableview 的第 0 部分中删除按钮【英文标题】:Removing Button From Section 0 in Tableview 【发布时间】:2018-03-22 17:29:25 【问题描述】:

我有一个包含 4 个部分的表格视图。在第 2、3 和 4 节中,我想要一个 + 按钮来将信息添加到“已保存”数组。我有添加信息的逻辑设置,但我遇到了表格视图单元格的问题。

我不希望 + 按钮出现在第 0 部分,因为这是我们添加数据的地方。这是我的 cellForRowAt 方法...

let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as! SchoolTableViewCell

    // Configure the cell...

    if indexPath.section == 0 
        cell.textLabel?.text = "Test"
        cell.addFavoritesButton.removeFromSuperview()
     else if indexPath.section == 1 
        cell.textLabel?.text = Items.sharedInstance.elementaryList[indexPath.row]
     else if indexPath.section == 2 
        cell.textLabel?.text = Items.sharedInstance.intermediateList[indexPath.row]
     else if indexPath.section == 3 
        cell.textLabel?.text = Items.sharedInstance.highschoolList[indexPath.row]
    
    return cell

一开始效果很好!但是如果我向下滚动,越来越多的单元格将删除该按钮。由于可重复使用的单元格,它不限于第 0 节。

谁能想到一个更好的方法来删除第一部分的这个按钮?

Screenshot of section 0

Screenshot of section 1

【问题讨论】:

因为您正在重用已完成cell.addFavoritesButton.removeFromSuperview() 的单元格。所以当它被重复使用时...... * * 再见,永远甜蜜甜蜜addFavoritesButton,不管你在哪个部分 【参考方案1】:

第一次运行正确显示单元格,因为所有单元格都是单元格类的新实例(不重复使用),但在滚动显示的单元格后可能会被重复使用,这个重复使用的单元格可能是您删除的第 0 节中的单元格按钮,你可以尝试显示/隐藏它

 if indexPath.section == 0 
    cell.textLabel?.text = "Test"
    cell.addFavoritesButton.isHidden = true
 
else

   cell.addFavoritesButton.isHidden = false

【讨论】:

谢谢!我尝试隐藏该按钮,但我从未确保为其他部分取消隐藏它。浪费了两个小时,但我不会再犯这个错误了! 是的,记住这个逻辑,你不知道它是否是一个显示/隐藏按钮的单元格 @DustinJohnson ,它也适用于任何 if 语句中的 cell.addFavoritesButton.isHidden = (indexPath.section == 0)【参考方案2】:

您忘记了单元格被重复使用。每次通过cellForRowAt 时,您都需要处理此单元格已经具有先前使用的按钮并且不应该在此使用中具有它的可能性,或者它可能缺少按钮并且在此使用中需要它的可能性.

例如,您不能仅仅因为该部分是1 就假设该单元格有按钮,因为它可能早先在0 部分中使用过,而现在缺少该按钮。在这种情况下,您需要添加它。但你没有这样做。

因此,对于逻辑的每个 分支,您必须明确说明是添加还是删除按钮。如果您真的要添加和删除它,那可能会变得复杂。您需要在某处保留按钮的副本,以便添加它。你要确保你不会将它两次添加到同一个单元格中。如果它已被删除,请确保不要尝试删除它。

正如另一个答案中所建议的那样,处理此问题的更简单方法根本不是添加和删除,而是使按钮的可见性取决于此部分是否为0

// do this in _every_ case
cell.addFavoritesButton.isHidden = (indexPath.section == 0)

单行代码就可以更好地完成您正在尝试做的事情。

【讨论】:

像往常一样,您的回答是明确而中肯的。 (已投票。)我也打算推荐设置 isHidden 状态,但你打败了我。 此代码将在第 0 部分显示按钮而不是隐藏它应该是 indexPath.section == 0 @Sh_Khan 谢谢,我会解决的【参考方案3】:

一旦您通过调用cell.addFavoritesButton.removeFromSuperview() 从单元格中删除按钮,当单元格被重复使用时,它将不会再次为您添加回来。您应该将按钮保留在单元格上,但用

隐藏它
cell.addFavoritesButton.isHidden = indexPath.section == 0

或添加一项新功能,让最终用户可以从第 0 部分中删除项目,并将按钮上的图片从 + 更改为 -

【讨论】:

隐藏按钮绝对是更明智的举措。然而,它仍然在较低的部分删除了它。 Sh_Khan 有一个非常简单的解决方案,可以为其他部分重新添加它。 @DustinJohnson 我的解决方案(任何ifs 之外的一行)将根据需要隐藏和取消隐藏按钮。 这个答案也会在一行代码中根据需要切换隐藏/显示,但我更喜欢根据问题显示逻辑,所以 OP 可以得到这个想法

以上是关于从 Tableview 的第 0 部分中删除按钮的主要内容,如果未能解决你的问题,请参考以下文章

从 tableView 中删除一行,在 section 中有多行

如果 rowsInSection = 0,则从 tableview 中删除部分

如何让 iOS 在 tableView 上显示删除按钮,但不允许从右侧完全滑动删除

删除 UIView 中 TableView 的记录

无法从自定义表格视图单元格按钮中删除行

tableview 删除部分中的最后一行