2016-11-15 35 views
1

删除特定的子节点我有一个UITableView它看起来像这样的图像我怎样才能在火力地堡从使用的UITableViewCell斯威夫特

this image

当我滑动删除记录时,我可以完全从存储它的数组中删除它,但我无法在Firebase中将其删除。

我的火力地堡数据库结构是上面的截图如下:

-KWc7RTuOe5PefiMM2tL 
    bodyPart: "Arms" 
    exerciseName: "Test 1 " 
    userId: "8rHmyTxdocTEvk1ERiiavjMUYyD3" 
-KWcEbpw_f6kxcePY5cO 
    bodyPart: "Chest" 
    exerciseName: "Test 2 " 
    userId: "8rHmyTxdocTEvk1ERiiavjMUYyD3" 
-KWcEdUN49QaJIVf0kwO 
    bodyPart: "Legs" 
    exerciseName: "Test 3 " 
    userId: "8rHmyTxdocTEvk1ERiiavjMUYyD3" 
-KWcFrMSaLKQRxghGHyT 
    bodyPart: "Arms" 
    exerciseName: "Test 4" 
    userId: "8rHmyTxdocTEvk1ERiiavjMUYyD3" 

如何访问创建时e.g“-KWc7RTuOe5PefiMM2tL”这样我就可以删除该子节点被设置在自动识别值?

或者,我还可以访问exerciseName值,具体取决于登录的UserId

+0

这一切都归结到你如何填充您的数据源阵列。看到我的答案可能会简化它。 – Jay

回答

1

从什么MHDev已经回答了继:

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
    if editingStyle == .delete { 

     if let exerciseName = exercises[indexPath.row].exerciseName { 

      let ref = FIRDatabase.database().reference().child("userExercises") 

      ref.queryOrdered(byChild: "exerciseName").queryEqual(toValue: exerciseName).observe(.childAdded, with: { (snapshot) in 

       snapshot.ref.removeValue(completionBlock: { (error, reference) in 
        if error != nil { 
         print("There has been an error:\(error)") 
        } 
       }) 

      }) 

     } 

     exercises.remove(at: indexPath.row) 
     tableView.deleteRows(at: [indexPath], with: .left) 
    } 
} 
2

为了解决这个问题,我在最终达到预期结果之前尝试了很多不同的方法。

要删除该值,我创建了一个对子节点'userExercises'的引用,然后通过'exerciseName'对它进行排序,然后.queryEqual(toValue :)从UITableViewCell中提取的练习名称值。

我然后取出的这个快照值和示例代码如下:

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
    if editingStyle == .delete { 

     if let exerciseName = exercises[indexPath.row].exerciseName { 

      let ref = FIRDatabase.database().reference().child("userExercises") 

      ref.queryOrdered(byChild: "exerciseName").queryEqual(toValue: exerciseName).observe(.childAdded, with: { (snapshot) in 

       snapshot.ref.removeValue(completionBlock: { (error, reference) in 
        if error != nil { 
         print("There has been an error:\(error)") 
        } 
       }) 

      }) 

     } 

     exercises.remove(at: indexPath.row) 
     tableView.deleteRows(at: [indexPath], with: .left) 
    } 
} 
1

这是一个相当直接的过程:

通常,对于tableViews数据源是一个数组。该数组是使用从Firebase快照读取的字典或从快照构建的对象数组(建议)构建的。

因此,这里是你的火力地堡结构(这是从一个节点填充从快照)

class Exercise { 
    key: "KWc7RTuOe5PefiMM2tL" 
    bodyPart: "Legs" 
    exerciseName: "Test 3 " 
    userId: "8rHmyTxdocTEvk1ERiiavjMUYyD3" 
} 

匹配,那么,当用户扫描行3为例为例,从阵列中检索练习对象,row3。

let theObject = ExerciseArray[3] 
let parentNode = theObject.key 
let ref = rootNode.child(parentNode) 
ref.setValue(nil) 

你就完成了。