0
votes
class RoomFeed: UIViewController, UITableViewDelegate, UITableViewDataSource{
let posts = Post(id: self.documentId , author: owner!, text: text!, amount: self.amount)
//This is called in the view controller which is "host of table View" 
//Document Id at this point is not nill confirmed.


}





class PostTableVIewCell: UITableViewCell {
//This is table view cell

var king: String!
var postID: String!

 override func awakeFromNib() {
        super.awakeFromNib()

    Firestore.firestore().collection("GeneralData").document("\(self.postID)").getDocument { document, err in
        if let document = document, document.exists {
            let data = document.data()
            self.king = data!["1"] as? String
            let placeamount = data!["amount"] as? String
            self.amountLabel.text = placeamount
    
        }
        print("KING: \(self.king!)")
        self.kingLabel.text = self.king
    }}

    func set(post:Post) {
         
            usernameLabel.text = post.author
            PostTextLabel.text = post.text
            self.amount = post.amount
          postID = post.id
        }
}

This is my code but I'm getting an error which states "'FIRESTORE INTERNAL ASSERTION FAILED: Invalid document reference. Document references must have an even number of segments" what am I doing wrong?

this is data structure

1
Please, can you provide the firebase database structure?Gius
Are you sure to pass the correct document ID? Are you sure it's not an optional?Gius
Yeah I printed the document ID in the console before these lines of code and it printed the proper document IDbiki codes
This is what the error more specifically says, "Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'FIRESTORE INTERNAL ASSERTION FAILED: Invalid document reference. Document references must have an even number of segments, but GeneralData has 1'"biki codes
The code is well written, it should work. Try entering document ID manually. Remember that amount is a number, not a String. let placeamount = data!["amount"] as? IntGius

1 Answers

0
votes

You are probably wrong approach. I wrote you an example code that might help you. Write me a comment if you need more help.

ViewController.swift

import UIKit
import Firebase

class ViewController: UIViewController {
    
    @IBOutlet weak var tableView: UITableView!
    
    var postDataList = [Post]()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.delegate = self
        self.tableView.dataSource = self
    
        Firestore.firestore().collection("GeneralData").getDocuments { document, err in
            if let document = document {
                let dataDescription = document.documents
                    
                for i in dataDescription {
                    let post = Post.init(data: i.data())
                    self.postDataList.append(post)
                }
                
                self.tableView.reloadData()
            }
            else {
                print("Document does not exist")
            }
        }
    }
    
}

extension ViewController: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.postDataList.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomTableViewCell
        
        let post = self.postDataList[indexPath.row]
        cell.setPost(post: post)
        
        return cell
    }
    
}

CustomTableViewCell.swift

import UIKit

class CustomTableViewCell: UITableViewCell {

    @IBOutlet weak var usernameLabel: UILabel!
    @IBOutlet weak var postTextLabel: UILabel!
    @IBOutlet weak var amountLabel: UILabel!
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    func setPost(post: Post) {
        self.usernameLabel.text = post.name
        self.postTextLabel.text = post.text
        self.amountLabel.text = String(post.amount)
    }

}

Post.swift

struct Post {
    let name: String
    let surname: String
    let owner: String
    let amount: Int
    let text: String
    let uid: String
    
    init(data: [String: Any]) {
        self.name = data["name"] as! String
        self.surname = data["surname"] as! String
        self.owner = data["owner"] as! String
        self.amount = data["amount"] as! Int
        self.text = data["text"] as! String
        self.uid = data["uid"] as! String
    }
}

This is the structure your database should have: enter image description here