为啥滚动后我的单元格中的图标会发生变化? [复制]

Posted

技术标签:

【中文标题】为啥滚动后我的单元格中的图标会发生变化? [复制]【英文标题】:Why are the icons from my cell changing after scrolling? [duplicate]为什么滚动后我的单元格中的图标会发生变化? [复制] 【发布时间】:2020-06-17 10:27:26 【问题描述】:

我制作了一个列表,用户可以在其中查看事件开始暂停还是停止

刚刚创建的事件没有图标也没有状态,返回时带有创建的时间戳

我遇到的问题是,当滚动出视图时,没有图标的空白单元格将其图标更改为“停止”。

events.asObservable()
            .bind(to:tableView.rx.items)  (tableView, row, event) in
                let cell = tableView.dequeueReusableCell(withIdentifier: "EventCell") as! EventCell
                cell.detailLabel.text = "created: \(self.dateFormat.string(from: event.created!)) Uhr"
                cell.titleLabel.text = event.name
                if let date = event.started 
                    cell.icon.image = UIImage(named: "start") 
                    var dateStr = "started: \(self.dateFormat.string(from: date))"

                    if let paused = self.isPaused(event: event) 
                        if paused 
                            dateStr = "\(dateStr), paused"
                            cell.icon.image = UIImage(named: "pause")
                        
                    

                    if let dateEnded = event.ended 
                        dateStr = "\(dateStr), ended: \(self.dateFormat.string(from: dateEnded))"
                        cell.icon.image = UIImage(named: "stop")
                    
                
                return cell

            .disposed(by: disposeBag)

发生了什么?

【问题讨论】:

还有:***.com/q/47093236 【参考方案1】:

这是由于单元重复使用造成的。您可能应该覆盖EventCell 中的prepareForReuse 方法,并将图像设置为初始图像或nil,然后再在下一个cellForRow(或UICollectionView 中的cellForItem)重用以解决此问题。

class EventCell: UITableViewCell  // (or UICollectionViewCell if issue is in UICollectionView)
    //...
    override func prepareForReuse() 
        super.prepareForReuse()
        imageView.image = nil // or a default placeholder image.
    

替代方法:您还可以在 UITableView 中的 cellForRow(或 UICollectionView 中的 cellForItem)方法中解决此问题,方法是将 imageView.image 设置为 nil 或顶部的占位符图像并继续。

对于 UITableView:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath)
    cell.imageView.image = nil // or a default placeholder image.
    //...
    return cell

对于 UICollectionView:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath)
    cell.imageView.image = nil // or a default placeholder image.
    // ...
    return cell

【讨论】:

以上是关于为啥滚动后我的单元格中的图标会发生变化? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥调用 location.reload(); 后我的表中的行顺序会发生变化?关闭模态框时

为啥集合视图中的动态集合单元格不显示为给定大小并且在 swift 3 中滚动后会发生变化

UITableView 的单元格中的 iOS Swift Like 按钮

为啥在滚动过程中单元格的孩子的高度会发生变化?

collectionView 中的图像在滚动时发生变化

当我在收藏视图中滚动时,我的自定义单元格中的 UIView 锚点不断变化