2016-08-31 8 views
1

ヘッドアップと同じようにFirebaseを使用してデータを保存/削除しています。ここでTableViewから削除するとインデックスが範囲外ですか?

は私のviewDidLoadコードです:

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    observePeople() 

    tableView.delegate = self 
    tableView.dataSource = self 

} 

observePeople()メソッドは、この(私は二度ここにテーブルをリロード)

func observePeople() 
{ 
    let ref = FIRDatabase.database().reference().child("Users") 
    ref.observeEventType(.ChildAdded, withBlock: 
    { (snapshot) in 

     if let firstname = snapshot.value?.objectForKey("firstname"), lastname = snapshot.value?.objectForKey("lastname") 
     { 
      let fullname = "\(firstname) \(lastname)" 
      self.names.append(fullname) 

      dispatch_async(dispatch_get_main_queue()) 
      { 
       self.tableView.reloadData() 
      } 
     } 

    }, withCancelBlock: nil) 

    ref.observeEventType(.ChildRemoved, withBlock: 
    { (snapshot) in 

    if let firstname = snapshot.value?.objectForKey("firstname"), lastname = snapshot.value?.objectForKey("lastname"), dateOfBirth = snapshot.value?.objectForKey("Date of Birth"), zipcode = snapshot.value?.objectForKey("Zipcode") 
    { 
     print("We deleted the person \(firstname) \(lastname) with the details: \(dateOfBirth), \(zipcode)") 
     self.tableView.reloadData() 
    } 

    }, withCancelBlock: nil) 
} 

のように動作し、私のviewDidAppearで、私は再びテーブルを更新します。

override func viewDidAppear(animated: Bool) 
{ 
    tableView.reloadData() 
} 

最後に、一度削除した行を削除すると、インデックスが鳴っているというエラーが表示されますe。興味深いのは、テーブルに4つのアイテムを入れるときです。最初のアイテムを削除すると2番目のアイテムが実際に削除され、3番目のアイテムを削除すると4番目のアイテムが削除されます。私はブレークポイントを追加して、この現象をできる限りうまく観察し、テーブルビューから削除した直後にブレークポイントを破棄しています。

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) 
{ 
    if editingStyle == .Delete 
    { 
     let ref = FIRDatabase.database().reference().child("Users") 
     ref.observeEventType(.ChildAdded, withBlock: { (snapshot) in 

      if let firstname = snapshot.value?.objectForKey("firstname"), lastname = snapshot.value?.objectForKey("lastname") 
      { 
       let fullname = "\(firstname) \(lastname)" 
       let currentName = self.names[indexPath.row] 

       if fullname == currentName 
       { 
        print("We have a match") 
        let currentKey = snapshot.key 
        ref.child(currentKey).removeValue() 

        dispatch_async(dispatch_get_main_queue()) 
        { 
         self.tableView.reloadData() 
        } 
       } 

      } 

      }, withCancelBlock: nil) 
    } 

     names.removeAtIndex(indexPath.row) 
     tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 
    } 
} 

したがって、tableView.deleteRowsメソッドの直後にエラーが表示されます。これはしばらくの間行っており、見つけられないようです。また、私は常に、データベースと配列の配列が一致していることを確認します。

+0

の名前の除去を挿入します。削除後のtableview自体が更新されるためです。 'print(currentName)'をチェックするとアイデアが得られます。 –

+0

ああ、それは動作しませんでしたが、私は私のcurrentNameを追跡するためにそれを印刷します –

答えて

2

を派遣する前にこれらの行を移動することがあると思います。あなたは配列から削除して、tableViewから行を削除する必要があるかもしれないと思うかもしれません。なぜなら、ほとんどの場合、配列データで何をするのでしょうか?しかし、そのため、firebaseが照会またはリスニングしているときに問題を引き起こします。これを処理する最善の方法は、配列やテーブルからcommitEditingStyle関数内のデータを手動で削除することではありません。代わりにfirebaseから値を削除するだけです。その後、.ChildRemovedのリスナーで、データの配列からオブジェクトを削除し、テーブルをリロードします。

はあなたの削除機能に `)このコード` self.tableView.reloadDataを(削除

names.removeAtIndex(indexPath.row) 
    tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 

を削除して.ChildRemovedリスナーに

ref.observeEventType(.ChildRemoved, withBlock: 
{ (snapshot) in 

if let firstname = snapshot.value?.objectForKey("firstname"), lastname = snapshot.value?.objectForKey("lastname"), dateOfBirth = snapshot.value?.objectForKey("Date of Birth"), zipcode = snapshot.value?.objectForKey("Zipcode") 
{ 
    print("We deleted the person \(firstname) \(lastname) with the details: \(dateOfBirth), \(zipcode)") 
    let fullname = "\(firstname) \(lastname)" 
    if let index = names.indexOf(fullname) { 
     names.removeAtIndex(index) 
     self.tableView.reloadData() 
    } 
} 

}, withCancelBlock: nil) 
+0

ああ、意味があります。非常に洞察力があり、ありがとう!これは私が必要としていたものです –

0

私は、あなたが一般的にテーブルをどのように動作するかfirebase変更での作業

names.removeAtIndex(indexPath.row) 
    tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 
+0

私は前にそれを試みましたが、それは動作しませんでした –

関連する問題