0

I am having trouble sending the postid to comments vc so that I can save it in Firebase.

I am following a tutorial online where we are building this architecture on Firebase however when I send the data to Firebase it is not capturing the postId as seen onthis screenshot. I'm obviously missing something. Would really appreciate it if someone could shed some light as to what my mistake could be. Below I'll put the Comments View Controller function where I send the data to Firebase.

  @IBAction func sendButtonPressed(_ sender: UIButton) {

    let ref = Database.database().reference()
    let commentsReference = ref.child("comments")
    let newCommentId = commentsReference.childByAutoId().key
    let newCommentReference = commentsReference.child(newCommentId)

    //current user information
    guard let currentUser = Auth.auth().currentUser else {
        return
    }

    let currentUserId = currentUser.uid
    newCommentReference.setValue(["userid": currentUserId, "commentText": commentTextField.text!]) { (error, ref) in

        if error != nil {
            ProgressHUD.showError(error!.localizedDescription)
            return
            }
        let postCommentRef = Database.database().reference().child("post-comments").child(self.postIdNew).child(newCommentId)
        postCommentRef.setValue(true, withCompletionBlock: { (error, ref) in
            if error != nil {
                ProgressHUD.showError(error!.localizedDescription)
                return
            }
        })
        self.empty()
        self.view.endEditing(true)
    }
}

This is how I'm supposed to get the postId reference from the Home View Controller.

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "commentSegue" {
        let commentVC = segue.destination as! CommentViewController
        let postId = sender as! String
        commentVC.postIdNew = postId
    }
}

Here are my collection view extensions

extension HomeViewController: UICollectionViewDelegate, UICollectionViewDataSource {

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

    if collectionView == self.lostCollectionView {

        return posts.count
    }

    if collectionView == self.foundCollectionView {

        return newPostsFound.count

    }

    if collectionView == self.adoptionCollectionView {

        return postsadoption.count
    }

    else {

        return 0
    }

}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    switch collectionView {

    case lostCollectionView:

        let lostcell: LostCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "Lostcell", for: indexPath) as! LostCollectionViewCell

        let post = posts[indexPath.row]
        let user = users[indexPath.row]
        lostcell.post = post
        lostcell.user = user

        //Make TextView Clickable
        lostcell.phoneLostTextView.isEditable = false;
        lostcell.phoneLostTextView.dataDetectorTypes = UIDataDetectorTypes.phoneNumber

        //Make Comments View Clickable
        lostcell.homeVC = self
        return lostcell


    case foundCollectionView:
        let foundcell: FoundCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "Foundcell", for: indexPath) as! FoundCollectionViewCell

        let post = newPostsFound[indexPath.row]
        foundcell.post = post

        //Make TextView Clickable
        foundcell.phoneFoundTextView.isEditable = false;
        foundcell.phoneFoundTextView.dataDetectorTypes = UIDataDetectorTypes.phoneNumber
        return foundcell

    case adoptionCollectionView:
        let adoptioncell: AdoptionCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "Adopotioncell", for: indexPath) as! AdoptionCollectionViewCell

        let post = postsadoption[indexPath.row]
        adoptioncell.post = post

        //Make TextView Clickable
        adoptioncell.phoneAdoptionTextView.isEditable = false;
        adoptioncell.phoneAdoptionTextView.dataDetectorTypes = UIDataDetectorTypes.phoneNumber
        return adoptioncell

    default:
        return UICollectionViewCell()
    }

    }

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {


    switch collectionView {

    case lostCollectionView:

        let vc = storyboard?.instantiateViewController(withIdentifier: "lostSelectedViewController") as? LostSelectedViewController
        self.navigationController?.pushViewController(vc!, animated: true)
        vc?.posts = posts[indexPath.row]
        break

    case foundCollectionView:
       let vc = storyboard?.instantiateViewController(withIdentifier: "foundSelectedViewController") as? FoundSelectedViewController
       self.navigationController?.pushViewController(vc!, animated: true)
        vc?.posts = newPostsFound[indexPath.row]
        break

    case adoptionCollectionView:
        let vc = storyboard?.instantiateViewController(withIdentifier: "adoptionSelectedViewController") as? AdoptionSelectedViewController
        self.navigationController?.pushViewController(vc!, animated: true)
        vc?.posts = postsadoption[indexPath.row]
        break

    default:
        break
    }

    func commentsViewPressed() {
        print("Hola")
        performSegue(withIdentifier: "commentSegue", sender: self)

    }
}

}

2 Answers2

0

The issue looks like its in this code

let postId = sender as! String
commentVC.postIdNew = postId

Sender refers to the object that initiated the segue, so likely a button or TableViewCell (see apples docs: https://developer.apple.com/documentation/uikit/uiviewcontroller/1621490-prepare)

You need to replace sender as! String with the value of the postId that you are trying to set. I assume that you can get that from somewhere on the first view controller.

darrenallen7
  • 821
  • 4
  • 9
0

Actually my mistake was nowhere here. My mistake was that my snapshot.key was not retreiving the childByAutoId so when I ran the query it gave me a list of matching children and since there was no single result, the SDK prints the key of the location/collection that you queried: posts.

All I had to do was to retrieve the childByAutoId I had to use this line:

 let key = childSnapshot.key as String

I found my answer in this stackoverflow question --> Firebase snapshot.key not returning actual key?