Swift tableview 填充单元格导致内容混淆

Posted

技术标签:

【中文标题】Swift tableview 填充单元格导致内容混淆【英文标题】:Swift tableview populating cells results in mixed up contents 【发布时间】:2017-03-25 10:40:32 【问题描述】:

在我的应用程序中,我正在使用自定义单元格填充表格视图,其中填充了使用 FirebaseUI 库从 Firebase 提取的数据。

此外,我将从打开的图形数据中获得的网站图标插入到单元格中。我坚持的是,当您上下移动表格时,网站图标会被断言到它们不属于的单元格。

例如: 单元格 1 包含指向 reddit 帖子的链接,因此被分配了 reddit favicon。 单元格 2 包含指向没有设置图标集的站点的链接,因此最初它是空的。

现在,如果您上下拖动表格,则该单元格也会设置 reddit favicon。一段时间后,几乎每个没有网站图标的单元格都会设置(错误的)网站图标。

override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)

    self.dataSource = self.tableView.bind(to: getQuery())  tableView, indexPath, snap in

        self.tableView.dataSource = self.dataSource
        self.tableView.delegate = self

        let cell = tableView.dequeueReusableCell(withIdentifier: "Cellident", for: indexPath)
        let customCell = cell as! CustomCellTableViewCell
        let theURLString = self.getURLString(obj: snap)

        let serialQueue = DispatchQueue(label: "scrapequeue")
        serialQueue.sync 
            self.scrapeFavicon(inputURL: theURLString, customCell: customCell)
        
    


func scrapeFavicon(inputURL: String, customCell: CustomCellTableViewCell) 

    OGDataProvider.sharedInstance.fetchOGData(urlString: inputURL) 

        [weak self] ogData, error in
        if let _ = error 
            return
        
        let imageURL = ogData.imageUrl
        let imageNSURL = NSURL(string: imageURL)

        customCell.FaviconView.af_setImage(withURL: imageNSURL as URL)

    

问题:这是一个异步问题,还是我在这里完全遗漏了什么?

当我滚动到表格的末尾并返回并重复此操作时,单元格每次都有不同的图像。

【问题讨论】:

请注意,当您滚动表格视图时,表格视图单元格会被重复使用。所以,我怀疑你没有设置图标,除非设置了图标并且没有清除没有图标的单元格的图标。那有意义吗?如果没有,您可以从您的表视图委托中发布cellForRowAt: 方法吗? @Fahim 实际上我没有那个方法。 那么你是如何为你的表格视图创建单元格的呢? FirebaseUI 库提供的上述绑定可以做到这一点。 我错过了抱歉,我有一个可能的解决方案,将其作为答案发布,因为我无法在评论中正确格式化代码... 【参考方案1】:

scrapeFavicon中,修改如下错误处理条件:

if let _ = error 
    return

将图像设置为nil。我没有使用 FirebaseUI 库,所以我不知道要使用的确切代码,但如果 FaviconViewUIImageView,你应该可以这样做:

if let _ = error 
    customCell.FaviconView.image = nil
    return

否则,您必须自己弄清楚如何将图像设置为nil。但这种基本方法应该可以解决问题。

更新:经过进一步讨论并查看源代码后,问题似乎出在 scrapeFavicon 方法上,因为每次重新加载单元格和上一个作业都会启动一次永远不会取消。因此,一个单元格可以运行多个作业来获取网站图标,并且在作业完成时加载到该单元格中的数据将是完全随机的。

【讨论】:

为什么与错误有关?为什么不在 awakeFromNib 方法中将图像设置为零? @Warhost 根据可用的代码,这似乎是可能的故障点。我想要测试的另一件事是,如果您超出错误范围,imageURL 是否总是导致有效的NSURL 实例(而不是nil)?如果不是,如果 URL 是 nilaf_setImage 方法会做什么? @OhadM 我在自定义单元格的 awakeFromNib 方法中尝试了self.FaviconView.image = nil。没有解决问题。 @Fahim 让我感到困惑的是,在向表格输入新条目时,它会随机分配到最后几个 favicon 之一。 @Warhost 在这一点上,与其冒险猜测,如果你能和我分享这个项目,我很乐意看看,看看发生了什么。如果您无法做到这一点,那么恐怕我不知道会发生什么。

以上是关于Swift tableview 填充单元格导致内容混淆的主要内容,如果未能解决你的问题,请参考以下文章

带有两个自定义单元格的 TableView 导致单元格重用问题(Swift 4)

Swift TableView 单元[关闭]

ViewController 中的 Swift TableView 在标签栏中的 Navigation VC 中:单元格不会填充列表中的数据

新的 Firebase 数据导致 TableView 单元格闪烁 (Firebase/iOS/Swift)

通过标识符设置表格视图单元格高度 - Swift

在 TableView 中创建的 7 个单元格后添加部分 - Swift