如何使tableView中单元格中的图像一致显示?

Posted

技术标签:

【中文标题】如何使tableView中单元格中的图像一致显示?【英文标题】:How to make consistent display of image in cell in tableView? 【发布时间】:2019-06-14 04:30:35 【问题描述】:

我在一个自定义单元格(称为“StoryCell”)中有一个图像,对该图像的引用位于 Realm 数据库中,并且我正在使用以下代码在 CellForRowAt 中加载该图像:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell    

 ....

let story = stories?[indexPath.row]

if story?.storyImage.isEmpty == true 

        print("Do nothing")
     else 

        let path = getDocumentDirectory().appendingPathComponent(story!.storyImage)

        do 
            let imageData = try Data(contentsOf: path)
            let retrievedImage = UIImage(data: imageData)
            cell.storyImage.image = retrievedImage

         catch 

            print("Error retrieving image: \(error)")

        
    

    cell.delegate = self

    return cell

但是,每当我添加新的表格项目时,在第八次之后,图像的显示就会变得不一致,即第一张图片在第八行重复。我知道这与表格视图中单元格的“重用”性质有关,并尝试使用上面代码中的“if”语句解决它,并在添加新项目时通过“重新加载”表格视图数据:

@IBAction func addStoryButton(_ sender: UIBarButtonItem) 

        let newStory = Story()

        newStory.dateCreated = Date()

        self.save(story: newStory)

  self.storiesTableView.reloadData()

但是,我仍然得到相同的行为。提前感谢您对此的任何想法。

【问题讨论】:

【参考方案1】:

这里有这个问题的完整解释:https://fluffy.es/solve-duplicated-cells/。我最终在 cellForRowAt 中使用以下代码解决了问题,尽管如 Rocky 所示,“reset”代码也可以放在“prepareForReuse”函数中。如下代码所示设置“defaultImage”也有帮助:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCell(withIdentifier: "storyCell", for: indexPath) as! StoryCell

    let story = stories?[indexPath.row]

    //reset to default image

    let defaultURL = Bundle.main.url(forResource: "test", withExtension: "jpg")

    do 
        let imageData1 = try Data(contentsOf: defaultURL!)
        let retrievedImage = UIImage(data: imageData1)
        cell.storyImage.image = retrievedImage

     catch 

        print("Error retrieving defaultImage: \(error)")

    

    //place saved image in storyImage

    if story?.storyImage.isEmpty == true 

        print("Do nothing")

     else 

        let path = getDocumentDirectory().appendingPathComponent(story!.storyImage)

        do 
            let imageData = try Data(contentsOf: path)
            let retrievedImage = UIImage(data: imageData)
            cell.storyImage.image = retrievedImage

         catch 

            print("Error retrieving image: \(error)")

        
    

    cell.delegate = self

    return cell

感谢@Rocky 让我走上了正确的道路。

【讨论】:

【参考方案2】:

prepareForReuse 是您要查找的方法。

override func prepareForReuse()         
    super.prepareForReuse()
    // Do your stuff here, like reset image or content of cell for reusing
    self.storyImage.image = nil

【讨论】:

感谢您的快速回复。当我尝试在我的 viewController 中使用“方法不会覆盖其超类中的任何方法”时,我收到了此错误消息。 您需要在自定义单元格(称为“StoryCell”)类中编写此方法。 恐怕这对我不起作用。我尝试将以下内容放入 prepareForReuse (在 StoryCell 中),但没有成功 - let path = getDocumentDirectory().appendingPathComponent(story!.storyImage) do let imageData = try Data(contentsOf: path) let retrievedImage = UIImage( data: imageData) storyImage.image = retrievedImage catch print("Error retrieving image: (error)") 在我的 StoryCell 中,我有一个名为“setStory”的函数,它使用:storyTitleField.text = story.title 设置单元格的标题。我很困惑为什么这个信息保持一致,但是当我在这个函数中设置图像时,图像却没有。

以上是关于如何使tableView中单元格中的图像一致显示?的主要内容,如果未能解决你的问题,请参考以下文章

如何停止透​​明PNG图像在tableview单元格中显示为黑色

如何使用 UIImage 从 tableview 单元格中的 url 平滑滚动

如何使用分页更改 tableview 自定义单元格中的 imageview 图像。

在类似于 facebook 或 pinterest 的 tableview 单元格中显示图像

ios在tableview单元格中显示/隐藏视图

将远程图像加载到 Tableview 单元格中