2017-07-25 16 views
1

テーブルビューは現在テーブルを更新し、Firebaseデータベースに追加されるとリアルタイムで新しいアイテムを追加します。問題は、リアルタイムで削除できないことです。 firebaseのデータをローカル配列に格納し、その配列をtableviewにロードしています。Fireviewで削除されたテーブルビュー項目を削除する方法

私のコードを少し凝縮しようとしました。私はまた、私のpopulateArrays()関数の中にremoveDeletedItems()関数の中にあるFirebaseコードを置いて、.childAddedリスナーの後に置くようにしましたが、リアルタイムでデータを削除することはできませんでした。

override func viewDidLoad() { 

     super.viewDidLoad() 
     populateArrays()   

    } 


    func removeDeletedItems() { 

     let databaseRef = FIRDatabase.database().reference() 
     databaseRef.child("Users").observe(FIRDataEventType.childRemoved, with: { (FIRDataSnapshot) in 

      guard let emailToFind = FIRDataSnapshot.value as? String else { return } 
      for (index, email) in self.usernames.enumerated() { 
       if email == emailToFind { 
        let indexPath = IndexPath(row: index, section: 0) 
        self.usernames.remove(at: index) 
        self.tableView.deleteRows(at: [indexPath], with: .fade) 
        self.tableView.reloadData() 
       } 
      } 
     }) 
    } 

func populateArrays(){ 

     let databaseRef = FIRDatabase.database().reference() 
     databaseRef.child("Users").observe(FIRDataEventType.childAdded, with: { (FIRDataSnapshot) in 

      if let data = FIRDataSnapshot.value as? NSDictionary { 
       if let name = data[Constants.NAME] as? String { 

           self.usernames.append(name) 
           self.removeDeletedItems() 
           self.tableView.reloadData() 
       } 
      } 
     }) 
    } 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 

     cell.textLabel?.text = usernames[indexPath.row]   
     return cell 
    } 

答えて

1

観測値は常に辞書ではありませんか?また、電子メールではなく名前を確認するべきですか?

名前を見つけるためのループは必要ありません。便利な機能があります。

databaseRef.child("Users").observe(FIRDataEventType.childRemoved, with: { snapshot in 

      guard let data = snapshot.value as? [String:Any], 
        let nameToFind = data[Constants.NAME] as? String else { return } 
       if let index = self.usernames.index(of: nameToFind) { 
        let indexPath = IndexPath(row: index, section: 0) 
        self.usernames.remove(at: index) 
        self.tableView.deleteRows(at: [indexPath], with: .fade) 
        // don't reload the table view after calling `deleteRows` 
       } 
      } 
     }) 
+0

私はConstants.EMAILを謝罪します。別のConstantsスウィフトファイルがあり、Constants.EMAILは単に "email"を意味します。私はそれを忘れてしまった。 – user2411290

+0

私は答えを更新したので、 'added'メソッドのように名前を調べるべきです。 – vadian

+0

これは機能します。私は本当にあなたの助けに感謝します! – user2411290

関連する問題