В табличном представлении перед загрузкой данных из базы данных я отображаю ячейку-заполнитель со статическим содержимым, изменяю свойства этой ячейки, скрываю несколько кнопок и отключаю взаимодействие с пользователем.
Я только что выяснил, чточто, даже если я удаляю секцию ячейки по адресу 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)
}
}