爲我的配置文件設置視圖控制器。登錄後,個人資料頁面可以無誤地顯示,但註冊時,按下位於視圖控制器底部的聯繫人按鈕時,應用會崩潰,如下所示。在swift中顯示firebase子從user.uid到用戶名3
的方法:
用戶註冊:
func signUp(_ email: String, usersname: String, password: String, data: Data!, loginHandler: LoginHandler?) {
FIRAuth.auth()?.createUser(withEmail: email, password: password, completion: { (user, error) in
if error != nil {
// Show error to user
self.handleFirebaseErrors(err: error as! NSError, loginHandler: loginHandler)
} else { // success creating user
if user?.uid != nil { // if there is a valid user id
// Store user to database
self.setUserInfo(user, usersname: usersname, email: email, password: password, data: data!)
// Log In the user
self.login(email: email, password: password, loginHandler: loginHandler)
}
}
})
}
如在註冊(),setUserInfo()被調用,其中包含的圖像,然後調用saveUser()
保存用戶
func saveUser(_ user: FIRUser!, usersname: String, email: String, password: String) {
// Create the user dictionary info
let userInfo = ["email": user.email!, "password": password, "usersname": usersname, "uid": user.uid, "photoUrl": String(describing: user.photoURL!)]
// create user reference
let userRef = DataService.Instance.dbRef.child("riders").child(user.uid)
// Save the user info in the database
userRef.setValue(userInfo)
}
個
登錄
func login(email: String, password: String, loginHandler: LoginHandler?) {
FIRAuth.auth()?.signIn(withEmail: email, password: password, completion: { (user, error) in
if error != nil {
self.handleFirebaseErrors(err: error as! NSError, loginHandler: loginHandler)
} else {
loginHandler?(nil, nil)
}
})
}
這裏的問題是saveUser(): 目前,火力顯示user.uid,但我想讓它顯示的用戶的用戶名。
let userRef = DataService.Instance.dbRef.child("riders").child(usersname)
與上面的代碼中,一旦按鈕被按下在RidersVC觸點,它崩潰應用程序,錯誤:
fatal error: unexpectedly found nil while unwrapping an Optional value
上MyProfileVC的56行:
let imageUrl = String(user.photoUrl)
不限想法,我可以如何讓用戶名顯示爲「騎手」的孩子,而不是沒有崩潰的user.uid?任何幫助,將不勝感激。
MyProfileVC.swift
if FIRAuth.auth()?.currentUser == nil {
let vc = UIStoryboard(name: "Rider", bundle: nil).instantiateViewController(withIdentifier: "Login")
present(vc, animated: true, completion: nil)
} else {
dbRef.child("riders/\(FIRAuth.auth()!.currentUser!.uid)").observe(.value, with: { (snapshot) in
DispatchQueue.main.async(execute: {
let user = User(snapshot: snapshot)
self.username.text = user.usersname
self.email.text = FIRAuth.auth()?.currentUser?.email
let imageUrl = String(user.photoUrl)
火力地堡數據庫結構:(我怎麼想它是)
{
"riders" : {
"rider 1" : {
"email" : "[email protected]",
"password" : "whatever",
"photoUrl" : "https://firebasestorage.googleapis.com/...",
"usersname" : "rider 1"
}
}
}
User.swift
struct User {
let usersname: String!
let email: String!
let password: String!
let photoUrl: String!
var ref: FIRDatabaseReference?
var key: String
init(snapshot: FIRDataSnapshot) {
key = snapshot.key
ref = snapshot.ref
let snapshotValueUsersname = snapshot.value as? NSDictionary
usersname = snapshotValueUsersname?["usersname"] as? String
let snapshotValueEmail = snapshot.value as? NSDictionary
email = snapshotValueEmail?["email"] as? String
let snapshotValuePass = snapshot.value as? NSDictionary
password = snapshotValuePass?["password"] as? String
let snapshotValuePhoto = snapshot.value as? NSDictionary
photoUrl = snapshotValuePhoto?["photoUrl"] as? String
}
火力地堡結構 - (現在的樣子)
{
"drivers" : {
"RideRequests" : {
"europeanjunkie" : {
"active" : true,
"latitude" : "45.267",
"longitude" : "-66.059",
"userId" : "5c17ByRJljZFcM703Vqn5eSFwYJ3",
"username" : "europeanjunkie"
}
}
},
"riders" : {
"5c17ByRJljZFcM703Vqn5eSFwYJ3" : {
"email" : "[email protected]",
"password" : "whatever",
"photoUrl" : "https://firebasestorage.googleapis.com",
"uid" : "5c17ByRJljZFcM703Vqn5eSFwYJ3",
"usersname" : "europeanjunkie"
}
}
}
您必須更改數據庫的數據結構。您將車手的孩子保存爲'uid'('userRef = DataService.Instance.dbRef.child(「riders」)。child(user.uid)')。但是,您希望將騎手的孩子作爲「用戶名」('DataService.Instance.dbRef.child(「騎手」)。child(用戶名)')。當然,它是零。 – WeiJay
代碼存在很多問題,但最重要的是您的User類中的快照正在做什麼。您可以發佈您的Firebase結構和您的用戶類的片段嗎?答案很簡單,但需要首先看到。 – Jay
@Jay添加了User.swift和Firebase結構 – LizG