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 库,所以我不知道要使用的确切代码,但如果 FaviconView
是 UIImageView
,你应该可以这样做:
if let _ = error
customCell.FaviconView.image = nil
return
否则,您必须自己弄清楚如何将图像设置为nil
。但这种基本方法应该可以解决问题。
更新:经过进一步讨论并查看源代码后,问题似乎出在 scrapeFavicon
方法上,因为每次重新加载单元格和上一个作业都会启动一次永远不会取消。因此,一个单元格可以运行多个作业来获取网站图标,并且在作业完成时加载到该单元格中的数据将是完全随机的。
【讨论】:
为什么与错误有关?为什么不在 awakeFromNib 方法中将图像设置为零? @Warhost 根据可用的代码,这似乎是可能的故障点。我想要测试的另一件事是,如果您超出错误范围,imageURL
是否总是导致有效的NSURL
实例(而不是nil
)?如果不是,如果 URL 是 nil
,af_setImage
方法会做什么?
@OhadM 我在自定义单元格的 awakeFromNib 方法中尝试了self.FaviconView.image = nil
。没有解决问题。
@Fahim 让我感到困惑的是,在向表格输入新条目时,它会随机分配到最后几个 favicon 之一。
@Warhost 在这一点上,与其冒险猜测,如果你能和我分享这个项目,我很乐意看看,看看发生了什么。如果您无法做到这一点,那么恐怕我不知道会发生什么。以上是关于Swift tableview 填充单元格导致内容混淆的主要内容,如果未能解决你的问题,请参考以下文章
带有两个自定义单元格的 TableView 导致单元格重用问题(Swift 4)
ViewController 中的 Swift TableView 在标签栏中的 Navigation VC 中:单元格不会填充列表中的数据