Передача идентификатора документа из Firestore с использованием segue в Swift

#ios #swift #firebase #google-cloud-firestore #segue

#iOS #swift #firebase #google-облако-firestore #segue

Вопрос:

Я изучаю как Swift, так и firebase, создавая приложение. В моем текущем firestore у меня есть база данных с именами игроков коллекции, а внутри коллекции есть документ с идентификатором автоматического документирования и двумя полями, такими как имя и электронная почта. Вот так. изображение firestore

Я также использую Firebase Auth, поэтому всякий раз, когда пользователь создает учетную запись, я помещаю его электронную почту в firestore с именем поля email.

Вот код для RegisterViewController, в котором пользователь регистрирует свою учетную запись с помощью электронной почты и пароля.

 import UIKit
import Firebase

class RegisterViewController: UIViewController {


    @IBOutlet weak var emailTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!

    let db = Firestore.firestore()

    override func viewDidLoad() {
        super.viewDidLoad()

    }



    //MARK: - register a new account

    @IBAction func registerPressed(_ sender: UIButton) {
    
        if let email = emailTextField.text, let password = passwordTextField.text {
        
            Auth.auth().createUser(withEmail: email, password: password) { authResult, error in
            
            
                if error != nil {
                
                // some codes here
                
                
                } else {
                
                    // Add a new document with a generated ID
                    var ref: DocumentReference? = nil
                
                    ref = self.db.collection(K.FStore.playersCollection).addDocument(data: [K.FStore.emailField: email, K.FStore.nameField: ""]) { (error) in
                    
                        if let err = error {
                            print("There was an issue storing data to firestore. (err)")
                        } else {
                            print("Document added with ID: (ref!.documentID)")
                        }
                    }
                
                    // pass this data
                
                    func prepare(for segue: UIStoryboardSegue, sender: Any?) {
                        if segue.identifier == K.registerToHome {
                            let homeVC = segue.destination as! HomeViewController
                        
                            homeVC.documentID = ref?.documentID
                        }
                    }
                
                     self.performSegue(withIdentifier: K.registerToHome, sender: self)
                
                }
            
            }
        
        }
    }



}
  

Я планирую проверить, есть ли у пользователя имя в поле «имя документа» в следующем HomeViewController, поэтому, если значение поля «имя» в документе равно "" , я хочу отобразить предупреждение с текстовым полем, чтобы пользователь мог добавить свое имя. Однако в HomeViewController мне нужен documentId, потому что я буду использовать этот код, db.collection(K.FStore.playersCollection).document(documentID).getDocument в HomeVC, поэтому я хочу передать documentId пользователя (в RegisterVC я смог получить значение как ref?.documentID , поэтому я просто хочу передать значение в HomeVC) в HomeVC. Я пытался использовать func prepare(for segue: UIStoryboardSegue, sender: Any?) , но мне не удалось передать значение…

Ответ №1:

Измените свой код на :

// Начало определения вашего кода id :

 var id = ""

else {
   // Add a new document with a generated ID
   var ref: DocumentReference? = nil
            
   ref = self.db.collection(K.FStore.playersCollection).addDocument(data: [K.FStore.emailField: email, K.FStore.nameField: ""]) { (error) in
                
       if let err = error {
          print("There was an issue storing data to firestore. (err)")
       } else {
          print("Document added with ID: (ref!.documentID)")
          self.id = ref!.documentID 
          self.performSegue(withIdentifier: K.registerToHome, sender: self)
       }
   }   
}
  

// Функция, не прошедшая регистрацию :

 // pass this data
            
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
   if segue.identifier == K.registerToHome {
        let homeVC = segue.destination as! HomeViewController
                    
         homeVC.documentID = self.id
   }
 }
  

Комментарии:

1. Итак, если я помещу функцию prepare вне функции registerPressed, как я могу получить доступ к ref?.documentId?