UITableViewCell 图像在上下滚动后发生变化,但 TextLabel 文本保持不变(iOS8,Swift)

Posted

技术标签:

【中文标题】UITableViewCell 图像在上下滚动后发生变化,但 TextLabel 文本保持不变(iOS8,Swift)【英文标题】:UITableViewCell Images Changing after Scrolling Up and Down but TextLabel Text Remain Same (iOS8, Swift) 【发布时间】:2015-01-19 17:46:26 【问题描述】:

我正在尝试创建一个用于练习的 RSS 应用程序。所以我的 tableView 单元格同时具有 textLabel 和图像。我的 textLabel 的文本和图像数据来自存储在 Core Data 中的字典。有些单元格有图像,有些则没有。 tableView 的初始加载对我来说看起来不错。但是当我向下和向上滚动时,单元格的图像似乎发生了变化。单元格的 textLabel 文本并没有改变。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
    self.configureCell(cell, atIndexPath: indexPath)
    return cell


func configureCell(cell: UITableViewCell, atIndexPath indexPath: NSIndexPath) 
    let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as NSManagedObject
    cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator
    cell.textLabel!.text = object.valueForKey("title")!.description

    var image: UIImage?
    if let imageData = object.valueForKey("imageData") as? NSData 
        image = UIImage(data: imageData)
        let itemSize = CGSizeMake(80, 80)
        UIGraphicsBeginImageContext(itemSize)
        let imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height)
        image?.drawInRect(imageRect)
        cell.imageView?.image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
    

如果初始 tableView 加载正确,这意味着我的 Core Data 正确存储了我的数据映射。但是当向下和向上滚动时,configureCell 再次被调用,因为它需要重绘单元格。 cell.textLabel!.text = object.valueForKey("title")!.description 再次设置正确,但此处没有图像。不知道为什么它会这样。请指点一下。

【问题讨论】:

【参考方案1】:

我曾经遇到过同样的问题,我认为这与重用单元格未处于默认状态有关,因此有时您设置的图像正在被重用。为了解决这个问题,我只是在 imageData 上做了一个else 条件,如果没有找到图像,则将图像设置为默认图像。我相信你也可以在这里将它设置为 nil。

    if let image = UIImage(contentsOfFile: imagePath) 
        cell.imageView.image = image
     else 
        // Default image or nil
        cell.imageView.image = UIImage(named: "Calendar")
    

我不建议将图像作为原始数据存储在核心数据中,因为这可能非常低效。相反,将它们下载到您的文档目录并在核心数据中存储一个文件名。

【讨论】:

它就像一个魅力。还要感谢图像下载和存储建议。我将探讨如何做到这一点。【参考方案2】:

我所做的是从 imageView 中删除图像并再次设置图像。它对我有用。

cell.imageView.image = nil
cell.imageView.image = UIImage(named:"Calendar")

【讨论】:

以上是关于UITableViewCell 图像在上下滚动后发生变化,但 TextLabel 文本保持不变(iOS8,Swift)的主要内容,如果未能解决你的问题,请参考以下文章

在滚动 UITableViewCell 添加按钮图像问题

自定义 UITableViewCell 图像直到滚动才显示

滚动时更新 UITableViewCell

重复的 UItableViewCell,UITableView 的行

滚动时 UITableViewCell 图像发生变化

表格向上滚动并返回该单元格时的 UITableViewCell 背景图像问题