Как сделать последовательное отображение изображения в ячейке в tableView? - PullRequest
0 голосов
/ 14 июня 2019

У меня есть изображение в пользовательской ячейке (называемой «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 ]

1 голос
/ 14 июня 2019

Полное объяснение этой проблемы здесь: https://fluffy.es/solve-duplicated-cells/. Я наконец-то решил со следующим кодом в cellForRowAt, хотя код «сброса» также может быть помещен в функцию «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 за указание правильного пути.

0 голосов
/ 14 июня 2019

prepareForReuse - это метод, который вы ищете.

override func prepareForReuse() {        
    super.prepareForReuse()
    // Do your stuff here, like reset image or content of cell for reusing
    self.storyImage.image = nil
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...