Почему кэшируются свойства удаленного раздела tableView? - PullRequest
0 голосов
/ 26 августа 2018

В табличном представлении перед загрузкой данных из базы данных я отображаю ячейку-заполнитель со статическим содержимым, изменяю свойства этой ячейки, скрываю несколько кнопок и отключаю взаимодействие с пользователем.
Я только что выяснил, чточто, даже если я удаляю секцию ячейки по адресу indexPath.section 0, когда поступают новые данные и вставляю ее с тем же индексом, старые настройки для ячейки, находящейся в очереди, кэшируются.Ранее я думал, что, как только я позвоню self.tableView.deleteSections(indexVal, with: .automatic), ячейка будет удалена, а новая ячейка будет снята.Может ли кто-нибудь объяснить мне такое поведение?
Я знаю, что это тривиальный вопрос, но я потратил несколько часов, чтобы найти эту ошибку в куче кода.

     var media = [Media]()

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

     let cell = tableView.dequeueReusableCell(withIdentifier: Storyboard.mediaCell, for: indexPath) as! MediaTableViewCell
     cell.delegate = self

  if firstMessagesLoaded == false {

         //hide some buttons and disable userInteraction
        cell.isUserInteractionEnabled = true
        return cell
    }

  if firstMessagesLoaded == true {
    //it turns out I have to enable userInteraction again here, otherwise it will remain disabled even though the section at this indexPath was deleted previously
    // cell.isUserInteractionEnabled = false
      return cell
    }
   }


 func fetchMediaChildAdded() {
    let newMedia = Media() //received from database ...

      //when new media is fetched, remove the placeholder media from array, delete the section and add new data
     if self.firstMessagesLoaded == false {
           self.firstMessagesLoaded = true

            //remove the mediaPlaceholder and delete it's section
        self.tableView.beginUpdates()
            self.media.remove(at: 0)
            let indexVal = IndexSet(integer: 0)
            self.tableView.deleteSections(indexVal, with: .automatic)
        self.tableView.endUpdates()
           if !self.media.contains(newMedia) {
            self.media.insert(newMedia, at: 0)
        }
 }

1 Ответ

0 голосов
/ 26 августа 2018

Это не ошибка.Это особенность.

Ячейки используются повторно (по соображениям производительности).Это поведение по умолчанию, которое подразумевает имя dequeueReusableCell.

  • Когда ячейка исчезает с экрана, она перемещается в пул как есть.
  • Когда вызывается dequeueReusableCell, ячейка удаляется из пула.Вы - разработчик - несете ответственность за установку всех элементов пользовательского интерфейса в определенное состояние.

Примечание:

Второе условие firstMessagesLoaded == false никогда не будет достигнуто, а beginUpdates / endUpdates имеетсовсем не влияет на одну операцию вставки / удаления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...