在tableView中,在从数据库下载数据之前,我将显示一个包含一些静态内容的占位符单元格,并更改该单元格的属性,隐藏多个按钮并禁用用户交互。
我刚刚发现的是,即使我删除了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)
}
}
答案 0 :(得分:3)
这不是错误。这是一个功能。
单元被重用(出于性能原因)。这是名称dequeueReusableCell
所暗示的默认行为。
dequeueReusableCell
时,会将一个单元格从池中取出。您(开发人员)负责将所有UI元素设置为已定义状态。旁注:
对于单个插入/删除操作,永远不会达到第二个条件firstMessagesLoaded == false
,并且beginUpdates / endUpdates
根本没有任何作用。