【问题标题】:Displaying Username in Swift and FireBase在 Swift 和 FireBase 中显示用户名
【发布时间】:2022-01-02 17:08:02
【问题描述】:

我正在尝试显示存储在 firebase 中的用户用户名。我不确定我是否正确保存了用户名,或者这是否是问题所在。我似乎根本无法访问或显示数据。有小费吗?我附上了 Cloud Firestore 的屏幕截图。

注册视图控制器

import UIKit
import FirebaseAuth
import Firebase
import AVKit
import FirebaseFirestore
class SignUpViewController: UIViewController {
var videoPlayer:AVPlayer?

var videoPlayerLayer:AVPlayerLayer?

@IBOutlet weak var firstNameTextField: UITextField!

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

@IBOutlet weak var passwordTextField: UITextField!

@IBOutlet weak var BackButton: UIButton!

@IBOutlet weak var UserNameTextField: UITextField!


@IBOutlet weak var signUpButton: UIButton!

@IBOutlet weak var errorLabel: UILabel!    

override func viewDidLoad() {
    super.viewDidLoad()
    let tap = UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing))
    view.addGestureRecognizer(tap)
    // Do any additional setup after loading the view.
    setupElements()        
}

func setupElements(){
    
    //hides the error label
    errorLabel.alpha = 0
    //styles the text and buttons
            
    Utilities.styleTextField(UserNameTextField)
    Utilities.styleTextField(firstNameTextField)
    Utilities.styleTextField(lastNameTextField)
    Utilities.styleTextField(passwordTextField)
    Utilities.styleTextField(emailTextField)
    Utilities.styleFilledButton(signUpButton)      
}    

/*
// MARK: - Navigation


  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // Get the new view controller using segue.destination.
    // Pass the selected object to the new view controller.
}
*/
 // this function makes sure all data is good
func validateFields() -> String?
{
    //make sure fields are filled
       if firstNameTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines) ==             "" || lastNameTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" || emailTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" || UserNameTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines) == ""
    {
        return "Please fill all fields"
    }
    
    let cleanPassword = passwordTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
    
    if Utilities.isPasswordValid(cleanPassword) == false{
        return "Needs 8 charaters, number, and special charater"
    }
    
    return nil
    
    
    
    
}


@IBAction func signUpTapped(_ sender: Any) {

    //validate fields
   
    let error = validateFields()
    
    if error != nil{
       showError(error!)
    }
    else{
        
        let firstName = firstNameTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
        let lastName = lastNameTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
        let email = emailTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
        let password = passwordTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
        let username = UserNameTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
        
   
        //create user
            
        Auth.auth().createUser(withEmail: email, password: password) { result, err in
                if err != nil{
                    
                    self.showError("Error creating user")
                }
                
                else
                {
                    //User is stored sucessfully, store the first and last name
                  
                    let database = Firestore.firestore()
                 
                 
                    database.collection("UserInfo").addDocument(data: ["firstname": firstName,"email": email, "lastname": lastName, "username": username, "uid": result!.user.uid]) {(error) in
                       
                        
                    
                        if error != nil
                        {
                            self.showError("First name and last name couldnt be saved.")
                        }
                    }
                    
                    self.transitionToHome()
                }
                
            
            }
        }
        
      
        
        
    }

    
    
    
   
    

func showError(_ message:String){
    
    
    errorLabel.text = message
    errorLabel.alpha = 1
    

    
 }
    func transitionToHome(){
    
    let homeViewController = storyboard?.instantiateViewController(identifier: Constants.StoryBoard.homeViewController) as?
        HomeViewController
    
    
    view.window?.rootViewController = homeViewController
    view.window?.makeKeyAndVisible()
    
    
}




override func viewWillAppear(_ animated: Bool) {
    
    //Set up video in background
    
    
    setUpVideo()
    
}

func setUpVideo(){
    
    
    //Get path to resource bundle
   let bundlePath = Bundle.main.path(forResource: "IMG_7211 2", ofType: "mov")
    
    guard bundlePath != nil else{
        return
    }
    //create the url from it
    
    let url = URL(fileURLWithPath: bundlePath!)
    
    
    
    //Create The video Player item
    let item = AVPlayerItem(url: url)
    //create the player

    
    
    videoPlayer = AVPlayer(playerItem: item)
   
    
    
    //create the layer
   
    
    
    videoPlayerLayer = AVPlayerLayer(player: videoPlayer!)
  
    
    
    //adjust the size and frame
    
    videoPlayerLayer?.frame = CGRect(x: -self.view.frame.size.width*1.5, y:0, width: self.view.frame.size.width*4, height: self.view.frame.size.height)
    
    view.layer.insertSublayer(videoPlayerLayer!, at: 0)
    
    //add and play
    
    videoPlayer?.playImmediately(atRate: 0.8)
}







}

CurrentUser.swift

import Foundation

struct CurrentUser{
let uid: String
let name: String
let email: String
let profilepictureURL:String


init(uid: String, dictionary: [String: Any]){
    self.uid = uid
    self.name = dictionary["username"] as? String ?? ""
    self.email = dictionary["email"] as? String ?? ""
    self.profilepictureURL = dictionary["profilepictureURL"] as? String ?? ""
}
}

ProfileViewController

 import UIKit
  import Firebase
 import FirebaseAuth
 import FirebaseInstallations
 import FirebaseFirestore
 import FirebaseStorage
 import FirebaseDatabase
   class ProfileViewController: UIViewController {


@IBOutlet weak var SignOut: UIButton!
@IBOutlet weak var UserName: UILabel!
override func viewDidLoad() {
    super.viewDidLoad()
    UserNameLabel()
    // Do any additional setup after loading the view.
}

func UserNameLabel()
{
    if Auth.auth().currentUser != nil
    {
        guard let uid = Auth.auth().currentUser?.uid else {return}
        
        Database.database().reference().child("users").child(uid).observeSingleEvent(of: .value) { (snapshot) in
            guard let dict = snapshot.value as? [String: Any] else {return}
            
            let user = CurrentUser(uid: uid, dictionary: dict)
            
            self.UserName.text = user.username
            
        }
                
    }

  
    
}

@IBAction func SignOut(_ sender: Any) {
    if Auth.auth().currentUser != nil {
           do {
               try Auth.auth().signOut()
               let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Vc")
               vc.modalPresentationStyle = .fullScreen
               present(vc, animated: true, completion: nil)

           }
        catch let error as NSError {
               print(error.localizedDescription)
           }
       }
}
         }

【问题讨论】:

  • 从那里我该怎么办?它仍然是新的

标签: swift google-cloud-firestore firebase-authentication


【解决方案1】:

问题是您将数据保存到 Firebase Firestore,然后尝试从 Firebase 实时数据库访问它。 Firebase 实时数据库和 Firebase Firestore 是 2 个完全不同的后端服务器,您正在尝试同时使用它们。你只需要选择 1 并坚持下去。

您正在使用以下方法将其保存到 firebase firestore:

 let database = Firestore.firestore()
 database.collection("UserInfo").addDocument()

然后将其保存到 Firestore 后,您尝试从实时数据库访问它,而不是 Firestore 导致它返回 nil:

Database.database().reference().child("users").child(uid).observeSingleEvent(of: .value) { (snapshot) in

因此,您需要做的是使用以下方法从 Firestore 中取回它:

Firestore.firestore().collection("s").getDocuments { query, error in
for doc in query!.documents {
    // Successfully retrieved data from firestore.
}

}

注意:您也可以将其保存到实时数据库而不是 firestore,但这取决于哪一个更适合您的应用。您需要选择 Firestore 或数据库,您不能同时使用两者。这里有更多信息可帮助您确定哪个更好。 More Info

【讨论】:

  • 我还是有点新,但我从那里去哪里
猜你喜欢
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 2016-10-20
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多