【发布时间】:2018-03-31 10:52:53
【问题描述】:
我有一个带有自定义单元格的表格视图。它们非常高,因此只有一个单元格在屏幕上完全可见,并且根据该单元格的位置,可能是第二个单元格的前 25%。这些单元格代表具有名称的虚拟项目。每个单元格内部都有一个按钮。第一次点击时,它会在单元格内显示一个小的UIView 并将项目添加到数组中,第二次点击时,将其隐藏并删除项目。添加和删除项目的部分工作正常,但是,由于单元格在UITableView中重用,存在与显示和隐藏视图相关的问题@
当我添加视图时,例如,在第一个单元格、第三个或第四个单元格上(重复使用单元格后)我仍然可以看到该视图。
为了防止这种情况,我尝试循环项目数组并根据每个单元格的名称标签文本检查它们的名称。我知道这种方法效率不高(如果有数千个呢?),但我还是尝试过。
这是它的简单代码(checkedItems 是项目数组,视图应该是可见的):
if let cell = cell as? ItemTableViewCell {
if cell.itemNameLabel.text != nil {
for item in checkedItems {
if cell.itemNameLabel.text == item.name {
cell.checkedView.isHidden = false
} else {
cell.checkedView.isHidden = true
}
}
}
乍一看,这段代码运行良好,但深入挖掘后发现了一些问题。当我点击第一个单元格以显示视图,然后我点击第二个单元格以在其上显示视图时,它工作正常。但是,例如,当我点击第一个和第三个时,第一个单元格上的视图消失了,但该项目仍在数组中。我怀疑,原因仍然是单元格被重复使用的事实,因为单元格的高度再次很大,因此当第三个单元格可见时,第一个单元格不可见。我尝试在tableView(_:,cellForRow:) 和tableView(_:,willDisplay:,forRowAt:) 方法中使用上面的代码,但结果是一样的。
所以,问题来了:我需要找到一种有效的方法来检查单元格并在checkedItems 中的项目中显示ONLY视图数组。
已编辑 这是单元格在有和没有视图的情况下的外观(紫色圆圈是按钮,视图是橙色的)
这里是按钮的代码:
protocol ItemTableViewCellDelegate: class {
func cellCheckButtonDidTapped(cell: ExampleTableViewCell)
}
细胞内:
@IBAction func checkButtonTapped(_ sender: UIButton) {
delegate?.cellCheckButtonDidTapped(cell: self)
}
在视图控制器内部(注意:这里的代码只是显示和隐藏视图。代码的目的是显示按钮如何与table view 交互):
extension ItemCellsTableViewController: ItemTableViewCellDelegate {
func cellCheckButtonDidTapped(cell: ItemTableViewCell) {
UIView.transition(with: cell.checkedView, duration: 0.1, options: .transitionCrossDissolve, animations: {
cell.checkedView.isHidden = !cell.checkedView.isHidden
}, completion: nil)
}
已编辑 2
这是tableView(_ cellForRowAt:) 方法的完整代码(我已经从问题中删除了循环部分,以明确该方法最初是做什么的)。单元格上的item 属性只是设置项目的名称(itemNameLabel 的text)。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCell(withIdentifier:
ItemTableViewCell.identifier, for: indexPath) as? ItemTableViewCell{
cell.item = items[indexPath.row]
cell.delegate = self
cell.selectionStyle = .none
return cell
}
return UITableViewCell()
}
我已经尝试了解决方案,建议here,但这对我不起作用。
如果您遇到过这样的问题并且知道如何解决,我将非常感谢您的帮助和建议。
【问题讨论】:
-
您想显示您点击的单元格中的视图以及隐藏的其他单元格视图吗?
-
@Kuldeep,是的。视图应该仅在点击按钮
for the first time的单元格中可见。所以,基本上,我的意思是在一个单元格中显示和隐藏视图,不应该影响其他单元格 -
执行以下操作:1. 在数组中添加 Tapped 单元格
indexPath,然后重新加载UITableView并在cellForRow方法中检查if([arrIndexpaths constainsobject:indexpath]) { show your view} else {hide your view}。 -
@Kuldeep,问题是,当我点击一个按钮时,单元格本身并没有被点击,所以我无法得到它的
indexPath -
我更新了答案,请查看。
标签: ios arrays swift uitableview uiview