gpt4 book ai didi

ios - 仅在 TableView 的特定单元格上显示和隐藏 View

转载 作者:行者123 更新时间:2023-11-28 14:53:39 25 4
gpt4 key购买 nike

我有一个带有自定义单元格的表格 View 。它们非常高,因此屏幕上只有一个单元格是完全可见的,并且可能是第二个单元格的前 25%,具体取决于该单元格的位置。这些单元格代表具有名称的虚拟项。每个单元格内都有一个按钮。第一次点击时,它会在单元格内显示一个小的 UIView 并将该项目添加到数组中,第二次点击时,会隐藏它并删除该项目。添加和删​​除项目的部分工作正常,但是,存在与显示和隐藏 View 相关的问题,因为单元格在 UITableView

中被重用

当我添加 View 时,例如,在第一个单元格、第三个或第四个单元格(在单元格被重用之后)我仍然可以看到那个 View 。

为了防止这种情况,我尝试循环项目数组并根据每个单元格的名称标签文本检查它们的名称。我知道这种方法效率不高(如果有数千个怎么办?),但我还是试过了。

这是它的简单代码(checkedItems 是项目数组, View 应该是可见的):

  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

}
}
}

这段代码乍看之下运行良好,但在深入挖掘之后会出现一些问题。当我点击第一个单元格以显示 View ,然后我也点击第二个单元格以显示其上的 View 时,它工作正常。但是,例如,当我点击第一个和第三个时,第一个单元格上的 View 消失了,但该项目仍在数组中。我怀疑,原因仍然是单元格被重复使用的事实,因为单元格的高度再次很大,所以当第三个单元格可见时,第一个单元格不可见。我尝试在 tableView(_:,cellForRow:)tableView(_:,willDisplay:,forRowAt:) 方法中使用上面的代码,但结果是一样。

所以,这就是问题所在:我需要找到一种高效方法来检查单元格并中的项目中显示 View checkedItems 数组。

已编辑这是单元格在有和没有 View 的情况下的样子(紫色圆圈是按钮, View 是橙色圆圈)

The view is hidden

The view is visible

下面是按钮的代码:

protocol ItemTableViewCellDelegate: class {
func cellCheckButtonDidTapped(cell: ExampleTableViewCell)
}

单元格内部:

 @IBAction func checkButtonTapped(_ sender: UIButton) {

delegate?.cellCheckButtonDidTapped(cell: self)
}

在 View Controller 内部(注意:这里的代码只是显示和隐藏 View 。代码的目的是显示按钮如何与 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 属性只是设置项目的名称(itemNameLabeltext)。

 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 ,但这对我不起作用。

如果您遇到过这样的问题并且知道如何解决,非常感谢您的帮助和建议。

最佳答案

试试这个。

全局定义:var arrIndexPaths = NSMutableArray()

func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 30
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:TableViewCell = self.tblVW.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as! TableViewCell

cell.textLabel?.text = String.init(format: "Row %d", indexPath.row)

cell.btn.tag = indexPath.row
cell.btn.addTarget(self, action: #selector(btnTapped), for: .touchUpInside)

if arrIndexPaths.contains(indexPath) {
cell.backgroundColor = UIColor.red.withAlphaComponent(0.2)
}
else {
cell.backgroundColor = UIColor.white
}

return cell;
}


@IBAction func btnTapped(_ sender: UIButton) {
let selectedIndexPath = NSIndexPath.init(row: sender.tag, section: 0)
// IF YOU WANT TO SHOW SINGLE SELECTED VIEW AT A TIME THAN TRY THIS
arrIndexPaths.removeAllObjects()
arrIndexPaths.add(selectedIndexPath)
self.tblVW.reloadData()
}

关于ios - 仅在 TableView 的特定单元格上显示和隐藏 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49586916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com