删除单元格后刷新tableView

时间:2017-07-01 08:12:20

标签: ios swift uitableview firebase-realtime-database

我有一个tableView,其中包含从Firebase填充的数据,当我点击删除按钮时,数据会从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,但这并没有帮助。我做错了什么?

3 个答案:

答案 0 :(得分: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()
                }
            }
        }

    })
}

没有测试过,所以如果您仍然遇到上述代码问题,请告诉我。

答案 1 :(得分:0)

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

            }

答案 2 :(得分:0)

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

您需要从posts数组中删除已删除的对象,然后重新加载这些行以获得效果。

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

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