滑动 UITableViewCell 操作会影响表格视图中的每 4 个单元格,而不仅仅是目标单元格
Posted
技术标签:
【中文标题】滑动 UITableViewCell 操作会影响表格视图中的每 4 个单元格,而不仅仅是目标单元格【英文标题】:Swiping a UITableViewCell action affects every 4th cell in the table view instead of ONLY the target cell 【发布时间】:2020-06-07 20:20:53 【问题描述】:我有一种奇怪的情况,我滑动一个单元格使其变灰,并且每隔 4 个或第 6 个单元格就会变灰,而不是仅滑动一个单元格。
tableview初始化如下:
func setupView()
view.backgroundColor = .white
tableView.register(EntityCell.self, forCellReuseIdentifier: "entityCell")
tableView.separatorStyle = .none
tableView.dataSource = self
tableView.delegate = self
这是我获取数据的查询:
func getEntities(taxId : String)
dispatchGroup.enter()
db.collection("Taxonomy").whereField("entityId", isEqualTo: entityId).whereField("status", isEqualTo: 401).getDocuments (orderSnapshot, orderError) in
if orderError != nil
self.showError(show: "Error", display: orderError!.localizedDescription)
else
self.entitiesArray.append(contentsOf: (orderSnapshot?.documents.compactMap( (orderDocuments) -> Order in
Order(dictionary: orderDocuments.data(), invoiceId: orderDocuments.documentID, opened: false)!
))!)
self.dispatchGroup.leave()
DispatchQueue.main.async
self.tableView.reloadData()
以下是填充 tableview 的标准覆盖函数:
override func numberOfSections(in tableView: UITableView) -> Int
return 1
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return entitiesArray.count
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
guard let cell = tableView.dequeueReusableCell(withIdentifier: "entityCell", for: indexPath) as? EntityCell else return UITableViewCell()
let entityRow = entitiesArray[indexPath.row]
cell.selectionStyle = .none
cell.setTaxonomy(entity: entityRow) // Setting up the cell with the array values
return cell
到目前为止一切正常。最后是滑动操作的覆盖函数:
override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
let complete = UIContextualAction(style: .normal, title: "Verified") (action, view, completionHandler) in
self.db.collection("Taxonomy").document(self.entitiesArray[indexPath.row].entityId).updateData(["status": 411]) (error) in
if error == nil
let cell = tableView.cellForRow(at: indexPath) as? EntityCell
cell?.changeStatus(currentEntity: self.entitiesArray[indexPath.row])
completionHandler(true)
complete.image = UIImage(named: "icon_approved")
complete.backgroundColor = UIColor(hex: Constants.Colors.secondary)
let swipe = UISwipeActionsConfiguration(actions: [complete])
return swipe
所以我从单元格的后缘向右滑动,我看到了预期的基础颜色和图标。并且通过协议通过此功能使单元格变为灰色:
extension EntityCell : EntityStatusDelegate
func changeStatus(currentEntity: EntityObject)
entityCellBackground.backgroundColor = .systemGray4
单元格变为灰色。然后我向下滚动,我看到每个第 4 或第 6 个单元格也是灰色的。知道出了什么问题吗?在这一点上我很困惑。
【问题讨论】:
【参考方案1】:细胞被回收。您需要完全配置它们,或者覆盖单元格的 prepareForReuse 函数,或者给每个单元格一个唯一的重用标识符,以便 tableview 可以回收它们。
(最后一个选项是最糟糕的,因为它需要更多的内存)
选项 1: 只需设置背景颜色:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
guard let cell = tableView.dequeueReusableCell(withIdentifier: "entityCell", for: indexPath) as? EntityCell else return UITableViewCell()
let entityRow = entitiesArray[indexPath.row]
cell.selectionStyle = .none
cell.setTaxonomy(entity: entityRow) // Setting up the cell with the array values
cell.entityCellBackground.backgroundColor = (whatever the default color is)
return cell
【讨论】:
我明白了。这就说得通了。请您详细解释第一个选项。 “完全配置它们”是什么意思?以上是关于滑动 UITableViewCell 操作会影响表格视图中的每 4 个单元格,而不仅仅是目标单元格的主要内容,如果未能解决你的问题,请参考以下文章
是否无法在 UITableViewCell 上的删除操作(滑动按钮)中使用自定义视图?
滑动删除 UITableViewCell 时,偶尔会出现红色减号删除图标
完全滑动删除 UITableViewCell 和部分滑动显示选项