如何使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 图像。