我试图从Firebase中删除某个项目,但我遇到了一个奇怪的问题。 这是功能:
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
//delete item from array
itemArray.remove(at: indexPath.row)
// delete from database
var itemRef = FIRDatabaseReference()
ref = FIRDatabase.database().reference()
let userID = FIRAuth.auth()?.currentUser?.uid
let idDel = itemArray[indexPath.row].itemID
itemRef = self.ref.child(userID!).child("ShoppingCart").child(idDel!)
itemRef.removeValue()
//delete row
cartTable.deleteRows(at:[indexPath], with: .fade)
}
}
问题在于,每次删除项目时,下一个项目都会在Firebase中删除,而不是我选择的项目。当我到达数组的末尾时,我得到错误“索引超出范围”。我猜这与索引路径/数组位置有关吗?
提前致谢!
答案 0 :(得分:2)
在您获得要告知Firebase删除的ID之前,您似乎要从数组中删除该项目。因此,对于每个项目,在删除后重新索引数组时,实际上将获得数组中下一项的id。如果您尝试使用最后一项删除最后一项,则数组将更改为n - 1的大小,然后您将尝试读取位置n,从而导致超出范围错误。
在检索Firebase删除的ID后,尝试从数组中删除该项。
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
// delete from database
var itemRef = FIRDatabaseReference()
ref = FIRDatabase.database().reference()
let userID = FIRAuth.auth()?.currentUser?.uid
let idDel = itemArray[indexPath.row].itemID
itemRef = self.ref.child(userID!).child("ShoppingCart").child(idDel!)
itemRef.removeValue()
//delete item from array
itemArray.remove(at: indexPath.row)
//delete row
cartTable.deleteRows(at:[indexPath], with: .fade)
}
}