为什么要缓存已删除的tableView部分的属性?

时间:2018-08-26 18:47:08

标签: swift uitableview

在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)
        }
 }

1 个答案:

答案 0 :(得分:3)

这不是错误。这是一个功能。

单元被重用(出于性能原因)。这是名称dequeueReusableCell所暗示的默认行为。

  • 当一个单元格从屏幕上消失时,它会原样移动到一个池中。
  • 调用dequeueReusableCell时,会将一个单元格从池中取出。您(开发人员)负责将所有UI元素设置为已定义状态。

旁注:

对于单个插入/删除操作,永远不会达到第二个条件firstMessagesLoaded == false,并且beginUpdates / endUpdates根本没有任何作用。