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

时间:2019-06-14 04:30:35

标签: swift uitableview uiimageview

我在自定义单元(称为“ 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()
}

但是,我仍然有相同的行为。在此先感谢您的任何想法。

2 个答案:

答案 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
}