删除单元格后刷新tableView

Posted

技术标签:

【中文标题】删除单元格后刷新tableView【英文标题】:refresh tableView after deleting cell 【发布时间】:2017-07-01 08:12:19 【问题描述】:

我有一个从 Firebase 填充数据的 tableView,当我单击删除按钮时,数据会从 Firebase 中删除,但它仍保留在我的应用程序中,并且在我关闭应用程序并重新打开它之前它不会从 tableView 中删除数据.以下是我设置删除功能的方法:

func deletePost() 
        let uid = FIRAuth.auth()!.currentUser!.uid
        let storage = FIRStorage.storage().reference(forURL: "gs://gsignme-14416.appspot.com")
        FIRDatabase.database().reference().child("posts").child(uid).observe(.childAdded, with:  (snapshot) in

            let indexPath = self.selectedIndex

            let post = self.posts[(indexPath?.row)!] as! [String: AnyObject]
            self.key = post["postID"] as? String

            self.itemsRef = FIRDatabase.database().reference().child("posts").child(uid).child(self.key!)


        // Remove the post from the DB
        FIRDatabase.database().reference().child("books").child(self.key!).removeValue  error in
            if error != nil 
                print("error \(error)")
            
        

            )
        self.TableView.reloadData()
    

这里是委托和数据源:

    func numberOfSections(in tableView: UITableView) -> Int 
            // #warning Incomplete implementation, return the number of sections
            return 1
        

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
         posts.count


    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
       self.selectedIndex = indexPath
        self.didExpandCell()
        if isExpanded && self.selectedIndex == indexPath
            print(indexPath)
         else
                    

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 

        if isExpanded && self.selectedIndex == indexPath
            return 300
        
              return 126
    


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cells", for: indexPath) as! ProfileTableViewCell

        //Configure the cell
        let post = self.posts[indexPath.row] as! [String: AnyObject]
        cell.Title.text = post["title"] as? String
        cell.Author.text = post["Author"] as? String
        cell.ISBN10.text = post["ISBN10"] as? String
        return cell
    

我试图在函数末尾添加一个 tableview.reloaddata 但这没有帮助。我做错了什么?

【问题讨论】:

请发布您的 tableview 委托和数据源函数,因为这些信息不足以提供帮助! 需要在removeValue的回调中调用reloadData()。 @SteffenSchmitz 这也不起作用 那你能把控制器的其余部分贴出来吗?尤其是在哪里分配 tableView 委托和委托实现? posts 数组中删除您的对象,然后在主队列中重新加载您的表视图,然后从 Firebase 中删除您的对象。 【参考方案1】:

posts 数组中删除您的对象,然后在主队列中重新加载您的tableView,您可以从firebase 中删除您的对象。

检查以下代码:

func deletePost() 
    let uid = FIRAuth.auth()!.currentUser!.uid
    let storage = FIRStorage.storage().reference(forURL: "gs://gsignme-14416.appspot.com")
    FIRDatabase.database().reference().child("posts").child(uid).observe(.childAdded, with:  (snapshot) in

        let indexPath = self.selectedIndex

        let post = self.posts[(indexPath?.row)!] as! [String: AnyObject]
        self.key = post["postID"] as? String

        self.itemsRef = FIRDatabase.database().reference().child("posts").child(uid).child(self.key!)


        // Remove the post from the DB
        FIRDatabase.database().reference().child("books").child(self.key!).removeValue  error in
            if error != nil 
                print("error \(error)")
             else 
                //Here remove your object from table array
                self.posts.remove(at: indexPath?.row)
                //Reload your tableview in main queue
                DispatchQueue.main.async
                    self.TableView.reloadData()
                
            
        

    )

没有测试过,如果您对上述代码仍有问题,请告诉我。

【讨论】:

我不确定我做错了什么,但删除后单元格仍然存在 你能分享任何演示项目吗?或在删除对象后检查打印。 @juelizabeth 之后尝试在 Firebase 控制台中添加一个孩子。您在 deletePost 函数中将 EventListener 注册到“.childAdded”。 removeValue 方法只有在你调用 deletePost 并添加了一个子节点后才会被调用。 @SteffenSchmitz 我不太确定该怎么做 @juelizabeth 尝试删除 ` FIRDatabase.database().reference().child("posts").child(uid).observe(.childAdded, with: (snapshot) in `删除块周围的部分。由于您不在代码中使用快照,因此您不需要它。我不确定何时调用 .childAdded,但这可能是一个问题。【参考方案2】:
        func deletePost() 
                let uid = FIRAuth.auth()!.currentUser!.uid
                let storage = FIRStorage.storage().reference(forURL: "gs://gsignme-14416.appspot.com")
                FIRDatabase.database().reference().child("posts").child(uid).observe(.childAdded, with:  (snapshot) in

                    let indexPath = self.selectedIndex

                    let post = self.posts[(indexPath?.row)!] as! [String: AnyObject]
                    self.key = post["postID"] as? String

                    self.itemsRef = FIRDatabase.database().reference().child("posts").child(uid).child(self.key!)


                // Remove the post from the DB
                FIRDatabase.database().reference().child("books").child(self.key!).removeValue  error in
                    if error != nil 
                        print("error \(error)")
                        return // use return here or use if else
                    
// no error has occurred,hence move on to remove the post from the array
              self.posts.remove(at: indexPath.row)
      )
                DispatchQueue.main.async 
                   self.TableView.reloadData()
                 

            

【讨论】:

您还应该在回调中重新加载数据。【参考方案3】:

同时从您的数组中删除已删除的对象。您的表格视图使用 posts 数组填充,而不是来自 Firebase 对象本身。当您单击删除按钮时,数据将从 Firebase 中删除,但仍保留在您的应用程序中,因为您尚未从数组中删除该对象,即 posts 这就是为什么它不会从 tableView 中删除数据,直到您关闭应用程序和重新打开它。

您需要从您的帖子数组中删除已删除的对象并重新加载该行以获得效果。

 self.posts.remove(at: indexPath.row)

然后重新加载该特定行本身。

 self.tableView.beginUpdates
 tableView.reloadRows(at: [indexPath], with: .top)
 self.tableView.endUpdates;

你的情况

 FIRDatabase.database().reference().child("books").child(self.key!).
   removeValue  error in
        if error != nil 
            print("error \(error)")
         else
          self.posts.remove(at: indexPath.row)
          self.tableView.beginUpdates
          tableView.reloadRows(at: [indexPath], with: .top)
          self.tableView.endUpdates;
        
    
  )

希望对您有所帮助。快乐编码!

【讨论】:

当我将 self.tableView.beginUpdates 放入 deletePost 函数时,我得到表达式解析为未使用的函数 这是我为了运行它而做的self.posts.remove(at: indexPath?.row) self.TableView.beginUpdates() self.TableView.reloadRows(at: [indexPath!], with: .top); self.TableView.endUpdates();

以上是关于删除单元格后刷新tableView的主要内容,如果未能解决你的问题,请参考以下文章

即使在删除某些单元格后,仍以与 TableView 单元格相同的顺序将文本字段值保存在数组中

从 UITableView 插入/删除单元格后的 IndexPath 错误

在 tableView 中选择单元格后布局更改

无法识别单击单元格后的 tableView segue

删除 tableview 单元格并刷新视图控制器后刷新 tableview

在 TableView 中创建的 7 个单元格后添加部分 - Swift