2017-03-12 12 views
5

私は、Instragram-esqueアプリケーションの作成に関するチュートリアルに従っています。Firebaseからも投稿を削除する方法もわかりませんフィード。ユーザーが選択したり、取るが、この機能をFirebaseデータベースにアップロードされていることをイメージ:Firebase(Swift)から子を削除する方法

func uploadToFirebase() { 
    AppDelegate.instance().showActivityIndicator() 

    let uid = FIRAuth.auth()!.currentUser!.uid 
    let ref = FIRDatabase.database().reference() 
    let storage = FIRStorage.storage().reference(forURL: "gs://cloudcamerattt.appspot.com") 

    let key = ref.child("posts").childByAutoId().key 
    let imageRef = storage.child("posts").child(uid).child("\(key).jpg") 

    let data = UIImageJPEGRepresentation(self.previewImage.image!, 0.6) 

    let uploadTask = imageRef.put(data!, metadata: nil) { (metadata, error) in 

     if error != nil { 
      print(error!.localizedDescription) 
      AppDelegate.instance().dismissActivityIndicator() 
      return 
     } 

     imageRef.downloadURL(completion: { (url, error) in 

      if let url = url { 
       // how do I add date: NSDate in here? 
       let feed = ["userID" : uid, 
          "pathToImage" : url.absoluteString, 
          "likes" : 0, 
          "author" : FIRAuth.auth()!.currentUser!.displayName!, 
          "postID" : key] as [String : Any] 

       let postFeed = ["\(key)" : feed] 

       ref.child("posts").updateChildValues(postFeed) 
       AppDelegate.instance().dismissActivityIndicator() 

       self.dismiss(animated: true, completion: nil) 
      } 
     }) 
    } 
    uploadTask.resume() 
} 

このように見てFirebaseで終わる:私が見つけた、スタックオーバーフローの答えに続き

enter image description here

、削除ボタンを押したときに呼び出されるdelete関数を設定しようとしました。この削除ボタンは、画像フィード内の画像をタップすることによってユーザーに表示される「写真の詳細」ビューにあります。この写真の詳細ビューは、好きなような他の情報とともに大きなサイズの画像を表示します。

func deletePost(firstTree: String, childIWantToRemove: String) { 

    let uid = FIRAuth.auth()!.currentUser!.uid 
    let ref = FIRDatabase.database().reference() 
    let storage = FIRStorage.storage().reference(forURL: "gs://cloudcamerattt.appspot.com") 

    let key = ref.child("posts").childByAutoId().key 
    let imageRef = storage.child("posts").child(uid).child("\(key).jpg") 

    ref.child("posts").child(key).child("postID").removeValue { (error, ref) in 
     if error != nil { 
      print("error \(error)") 
     } 
    } 
} 

そして、ここで関数を呼び出す:

@IBAction func moreButtonPressed(_ sender: AnyObject) { 

    let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet) 
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) 
    let destroyAction = UIAlertAction(title: "Delete", style: .destructive) { action in 
     print(action) 

     let ref = FIRDatabase.database().reference() 
     let key = ref.child("posts").childByAutoId().key 

     let firstTree = key 
     let valueToRemove = "postID" 
     self.deletePost(firstTree: firstTree, childIWantToRemove: valueToRemove) 
    } 

    alertController.addAction(destroyAction) 
    alertController.addAction(cancelAction) 
    self.present(alertController, animated: true) 
} 

私は本当に私もやっている理解し、削除ボタンをタップすると、基本的に何もしないことは言うまでもないていませんよ。誰も私に画像を削除することができるように削除機能を修正する方法を示すことができますか/ firebaseから正しく投稿するには?

EDIT:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    let photoDetailController = self.storyboard?.instantiateViewController(withIdentifier: "photoDetail") as! PhotoDetailController 

    photoDetailController.selectedPost = posts[indexPath.row] 

    present(photoDetailController, animated: true, completion: nil) 
} 

だから、それはインデックスパスを持っている:私はそうのようなdidSelectItemにFeedViewController(画像送り)から渡された私のPhotoDetailController、中var selectedPost: Post!を持っています。上記の関数に関するもう一つの注意点は、var posts = [Post]()がFeedViewControllerでインスタンス化されていることです。したがって、posts[indexPath.row]の由来です。

+0

詳細ビューに現在の投稿の情報が表示されているあなたの詳細ビューに投稿オブジェクトがありますか?または投稿の情報を含むオブジェクト(IDなど)? –

+0

Hey Pieterはい私は、フィードから選択された画像のPostオブジェクトとインデックスパスを保持する変数を持っています。私の編集を確認して、そこにコードを入れて明確にします。 – KingTim

答えて

4

これは機能するはずです。

func deletePost() { 
    let uid = FIRAuth.auth()!.currentUser!.uid 
    let storage = FIRStorage.storage().reference(forURL: "gs://cloudcamerattt.appspot.com") 

    // Remove the post from the DB 
    ref.child("posts").child(selectedPost.postID).removeValue { error in 
    if error != nil { 
     print("error \(error)") 
    } 
    } 
    // Remove the image from storage 
    let imageRef = storage.child("posts").child(uid).child("\(selectedPost.postID).jpg") 
    imageRef.delete { error in 
    if let error = error { 
     // Uh-oh, an error occurred! 
    } else { 
    // File deleted successfully 
    } 
    } 
} 

また.childByAutoId().keyをDBに項目を挿入するための鍵を生成します。あなたはそれを使用することはできません既存のアイテムへの参照を取得します。

+0

ありがとうございました!それは完璧に働いた。あなたのコードを見て、これは実際に私が思ったよりも簡単になった、私はどのようにchildByAutoIDを使用するかを理解しようとして詰め込まれていた。おかげさまで大変ありがとう – KingTim

関連する問題