ヘッドアップと同じように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メソッドの直後にエラーが表示されます。これはしばらくの間行っており、見つけられないようです。また、私は常に、データベースと配列の配列が一致していることを確認します。
の名前の除去を挿入します。削除後のtableview自体が更新されるためです。 'print(currentName)'をチェックするとアイデアが得られます。 –
ああ、それは動作しませんでしたが、私は私のcurrentNameを追跡するためにそれを印刷します –