滑动 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

完全滑动删除 UITableViewCell 和部分滑动显示选项

UITableViewCell嵌套UICollectionView滑动错乱问题

UITableViewCell 如何检测用户向左或向右滑动?