为什么当用户点击接受button时,表格视图中的单元格会重复?

我正在开发一个应用程序,用户可以向其他用户发送好友请求,接收请求的用户可以接受或删除它。 它按预期工作。 但是,当用户单击接受button时,tableView(显示接收到的请求)的单元格将重复。 而当我重新加载表视图或重新启动应用程序,它显示所需的结果,即只显示待处理的请求。 此外,数据按预期存储在Firebase数据库中。 唯一担心的是最初复制细胞后的自发性和错误。 另外,我如何定制单元格,以便每当用户单击接受或删除button时,只有该单元格变暗,然后从表中删除?

编辑:

我已经尝试使用viewDidLoad代替viewDidAppear呢!

接收到的请求函数的代码:

override func viewDidAppear(_ animated: Bool) { receivedFunc() refresher = UIRefreshControl() refresher.attributedTitle = NSAttributedString(string: "Pull to refresh") refresher.addTarget(self, action: #selector(ReceivedViewController.receivedFunc), for: UIControlEvents.valueChanged) receivedTable.addSubview(refresher) } func receivedFunc() { // ref = Database.database().reference() let currentUserID = Auth.auth().currentUser?.uid refHandle = ref.child("users").child(currentUserID!).observe(.value, with: { (snapshot) in if let userDict = snapshot.value as? [String: Any] { if let requests = userDict["requests"] as? [String: String] { print("processing requests") self.userIDs.removeAll() self.userNames.removeAll() self.userImages.removeAll() for request in requests { if request.value == "received" { self.refHandle = self.ref.child("users").child(request.key).observe(.value, with: { (snapshot) in if let userDict = snapshot.value as? [String: Any] { if let userName = userDict["name"] { let storage = Storage.storage() let storageRef = storage.reference(forURL: "gs://money-owelend.appspot.com") let profilePhotoRef = storageRef.child(request.key + "profile_photo.jpg") profilePhotoRef.getData(maxSize: 1 * 1024 * 1024) { data, error in if let error = error { print("couldn't download the image") } else { self.userNames.append(userName as! String) self.userIDs.append(request.key) self.userImages.append(UIImage(data: data!)!) // self.receivedTable.reloadData() self.refresher.endRefreshing() } } } } }, withCancel: { (error) in print("error observing value \(error)") }) } } // reload data here } } }, withCancel: { (error) in print("error observing value \(error)") }) } public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return userIDs.count } public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "CellReceived", for: indexPath) as! ReceivedTableViewCell cell.hiddenIDLabel.text = userIDs[indexPath.row] cell.userName.text = userNames[indexPath.row] cell.userImage.image = userImages[indexPath.row] return cell } 

最后,单元的代码:

  @IBAction func acceptButton(_ sender: Any) { // add the user to current user's friend list ref = Database.database().reference() let currentUserRef = ref.child("users").child(currentUserID!) currentUserRef.observeSingleEvent(of: .value, with: { (snapshot) in if snapshot.hasChild("friends"){ self.ref.child("users").child(self.currentUserID!).child("friends").updateChildValues([self.hiddenIDLabel.text!: "true"]) } else{ self.ref.child("users").child(self.currentUserID!).child("friends").setValue([self.hiddenIDLabel.text!: "true"]) } print("user successfully added as a friend to current user's list") }) // remove this request from user's received requests let currentUserDeleteRef = ref.child("users").child(currentUserID!) currentUserDeleteRef.observeSingleEvent(of: .value, with: { (snapshot) in self.ref.child("users").child(self.currentUserID!).child("requests").child(self.hiddenIDLabel.text!).removeValue() }) // add the current user to the user's friend list let senderRef = ref.child("users").child(hiddenIDLabel.text!) senderRef.observeSingleEvent(of: .value, with: { (snapshot) in if snapshot.hasChild("friends"){ self.ref.child("users").child(self.hiddenIDLabel.text!).child("friends").updateChildValues([self.currentUserID!: "true"]) } else{ self.ref.child("users").child(self.hiddenIDLabel.text!).child("friends").setValue([self.currentUserID!: "true"]) } print("user successfully added as a friend to sender's list") }) // remove this request from sender's sent requests let senderDeleteRef = ref.child("users").child(hiddenIDLabel.text!) senderDeleteRef.observeSingleEvent(of: .value, with: { (snapshot) in self.ref.child("users").child(self.hiddenIDLabel.text!).child("requests").child(self.currentUserID!).removeValue() }) } 

我的firebase数据库