将项目动态添加到 TableView 导致重复单元格

Posted

技术标签:

【中文标题】将项目动态添加到 TableView 导致重复单元格【英文标题】:Dynamically adding item to TableView resulted in repeated cells 【发布时间】:2019-12-31 13:11:57 【问题描述】:

我有一个从 Firebase 数据库动态加载数据的 tableview。我还有一个添加按钮,允许用户在必须更新表视图之后在 Firebase 数据库中添加并再次从 firebase 重新加载数据以及新添加的项目。但是,我遇到了一个问题,即添加项目后表格视图中的数据重复。我试图清除数据源数组,然后重新加载表视图数据,但它不起作用。这是我的代码:

  override func viewDidLoad()

    recipeTableView.delegate = self
    recipeTableView.dataSource = self
    // clear the array
    myRecipes.removeAll()
    // get recipes
    getRecipes()

表格视图扩展功能

    func numberOfSections(in tableView: UITableView) -> Int
    
        return 1
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    
        return myRecipes.count
    
  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    
         recipe = self.myRecipes[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: "MyRecipeCell")
            as! UIMyRecipesCell
        cell.setRecipe(recipe: recipe!)
    

从火力基地获取数据的方法

func getRecipes()

 self.myRecipes.removeAll()
 childRef.observe(.value, with:  snapshot in
 for child in snapshot.children
 
  //create the object and get the info from the fire base and finally store it MyRecipes array
 self.myRecipes.append(recipe)
                
  self.recipeTableView.reloadData()

            )

【问题讨论】:

【参考方案1】:

您需要使用observeSingleEvent 而不是observe

childRef.observeSingleEvent(of: .value)  snapshot  in 
   ////         

childRef.observe(.childAdded)  snapshot  in 
   ////         

childRef.observe(.value, with:  snapshot in
   self.myRecipes.removeAll ()
   /// 

observe 每次更改都会再次获取所有数据,而observeSingleEvent 会获取所有数据一次

【讨论】:

以上是关于将项目动态添加到 TableView 导致重复单元格的主要内容,如果未能解决你的问题,请参考以下文章

iOS动态地将新单元格加载到表格视图的底部

重用 tableview 单元格中的元素

更改 tableView 单元格的高度不起作用

如何通过按下 iPhone 中的按钮将行/单元格动态添加到 UITableView

ScrollView中TableView的动态高度[重复]

如何将子视图添加到 TableViewCell?