我有一个包含4个部分的tableview。在2,3和4节中,我想要一个+按钮来向" Saved"添加信息。阵列。我有添加信息的逻辑设置,但我遇到了tableview单元的问题。
我不希望+按钮出现在第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部分。
有人能想到更好的方法只删除第一部分的这个按钮吗?
答案 0 :(得分:2)
首次运行正确显示单元格,因为所有单元格都是单元格类的新实例(没有重复使用),但滚动后显示的单元格可能会重复使用,这个重用的单元格可能是第0部分中删除的单元格按钮,你可以尝试显示/隐藏它
if indexPath.section == 0 {
cell.textLabel?.text = "Test"
cell.addFavoritesButton.isHidden = true
}
else
{
cell.addFavoritesButton.isHidden = false
}
答案 1 :(得分:2)
您忘记了细胞被重复使用。每次通过cellForRowAt
时,您都需要处理此单元格已经具有以前使用的按钮的可能性,并且不应该在此用途中使用该按钮,或者它可能缺少按钮并且需要它这个用途。
例如,您不能假设仅因为该部分为1
,该单元格具有该按钮,因为它可能已在之前的0
部分中使用过,现在缺少该按钮。在这种情况下,您需要添加它。但你不是那样做的。
因此,对于逻辑的每个分支,您必须明确是否添加或删除按钮。如果你真的要添加和删除它,那可能会变得复杂。您需要在某处保留按钮的副本,以便添加它。你要确保不要将它两次添加到同一个单元格。如果已经删除它,请确保不要尝试删除它。
正如在另一个答案中所建议的那样,处理此问题的简单方法不是添加和删除,而是根据此部分是否为{{1来使按钮的可见性 }}:
0
这是一行代码,它更好地完成了你想要做的事情。
答案 2 :(得分:1)