我在自定义单元(称为“ 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()
}
但是,我仍然有相同的行为。在此先感谢您的任何想法。
答案 0 :(得分:1)
此处是对此问题的完整解释:https://fluffy.es/solve-duplicated-cells/。我终于在cellForRowAt中使用以下代码解决了问题,尽管“重置”代码也可以放置在Rocky指示的“ 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让我走上正确的道路。
答案 1 :(得分:0)
prepareForReuse
是您要寻找的方法。
override func prepareForReuse() {
super.prepareForReuse()
// Do your stuff here, like reset image or content of cell for reusing
self.storyImage.image = nil
}