Получение ссылки на документ на контроллере второго вида - PullRequest
0 голосов
/ 04 марта 2020

Может ли кто-нибудь помочь, чтобы, когда пользователь нажимает на имя клиента (используя табличное представление), его данные отображались на втором контроллере представления (V C). Я думаю, что это потому, что я не вытащил documentID до этого. Я попытался добавить documentID во Второй V C .document (documentID)

Начальный V C код

    var customerList = [CustomerLsModel]()
    override func viewDidLoad() {
            super.viewDidLoad()
            let db = Firestore.firestore()

            db.collection("customers").getDocuments() { (snapshot, error) in
                if let error = error{
                    print("Can't get customers: \(error)")
                    let alert = UIAlertController(title: "Error", message: "There was an issue in pulling your information. Please close the application and try again.", preferredStyle: .alert)
                    alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil))
                    self.present(alert, animated: true)
                } else {
                    for document in snapshot!.documents{
                        let firstname = document["firstname"]
                        let lastname = document["lastname"]
                        let address = document["address"]
                        let customer = CustomerLsModel(firstname: firstname as! String?, lastname: lastname as! String?, address: address as! String?)

                        self.customerList.append(customer)
                        self.orderAndLimit()
                    }
                    self.customerTable.reloadData()
                }
            }
        }
    }

Второй V C

   let db = Firestore.firestore()
    db.collection("customers").document().getDocument { (document, Error) in
        if let document = document, document.exists{
            self.firstNameLabel.text = document.get("firstname") as? String
        }
    }

Это мой класс модели клиента

    class CustomerLsModel{
        var firstname: String!
        var lastname: String?
        var address: String?

        init(firstname: String?, lastname: String?, address: String?){
            self.firstname = firstname
            self.lastname = lastname
            self.address = address
        }

Ответы [ 2 ]

0 голосов
/ 07 марта 2020

Ответ будет зависеть от того, как вы хотите работать с данными, но есть два способа. Но ваш инстинкт верен - вам нужно следить за документами клиентов.

Так что вы можете сделать это при чтении клиентов из Firestore и передать все строки и идентификатор документа для заполнения каждого объекта

class CustomerLsModel{
   var firstname: String!
   var lastname: String?
   var address: String?
   var docId: String!

   init(firstname: String?, lastname: String?, address: String?, docId: String) {
      self.firstname = firstname
      self.lastname = lastname
      self.address = address
      self.documentId = docId
   }
}

или то, что делает код немного проще, передавая снимок Firestore оттуда

class CustomerLsModel {
   var firstname: String?
   var lastname: String?
   var address: String?
   var docId: String!

    init(withDoc: QueryDocumentSnapshot) {
        self.docId = withDoc.documentID
        self.firstname = withDoc.get("first_name") as? String ?? "no first"
        self.lastname = withDoc.get("last_name") as? String ?? "no last"
        self.address = withDoc.get("addres") as? String ?? "no address"
    }
}

оттуда, когда пользователь выбирает клиента, вы можете либо передать этот объект в контроллер подробного представления для отображения или просто передайте docId и используйте его в дочернем viewController для чтения данных из Firestore.

Существует около 100 способов «передачи» данных - Segue - популярный выбор, который вы могли бы также установите переменную customer в детальном viewController, иначе детальная информация может считывать данные из мастера. Это действительно зависит от вашего варианта использования.

0 голосов
/ 05 марта 2020

Согласно Firebase документации для Swift, если вы используете метод document() без параметра пути, вы создаете DocumentReference для нового документа. Поэтому, если вы попробуете getDocument по этой ссылке - она ​​пуста.

Только если вы добавите путь в параметр, вы получите данные из существующего документа.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...