【发布时间】:2020-11-15 21:25:02
【问题描述】:
在一个视图中,我有这个函数来注册并获取用户名
func signUp() {
if self.email != "" {
if self.password == self.repass {
session.signUp(email: email, password: password) { (result, error) in
if error != nil {
self.error = error!.localizedDescription
//self.error = "A senha deve ter 6 caracteres ou mais"
}
else{
self.email = ""
self.password = ""
let db = Firestore.firestore()
db.collection("Users").document(result!.user.uid).setData(["userName": userName]) { (error) in
if error != nil{
}
}
}
}
}
else{
self.error = "Senhas não coincidem"
}
}
else{
self.error = "Complete todos espaços"
}
}
在其他视图中,我想获取用户键入的广告显示它的用户名,但为此我需要链接两个视图以访问 func SignUp。怎么做?
编辑:
根据我给出的答案,我做了相应的修改:
会话存储:
@Published var session: User? = nil
var handle: AuthStateDidChangeListenerHandle?
@Published var userName: String = ""
func listen() {
handle = Auth.auth().addStateDidChangeListener({ [self] (auth, user) in
if let user = user {
self.session = User(uid: user.uid, email: user.email!, userName: userName)
}
else {
self.session = nil
}
})
}
struct User {
var uid:String
var email:String
var userName: String
}
HomeView ----> var userName: User
Text(userName.userName)
-
解释我的代码是如何工作的:
@main视图是MedAppApp: App。从那里,代码转到ContentView。如果session.session != nil,TransitionView,否则,SignView。从SignView开始,我同时拥有SignInView和SignUpView视图,它们分别拥有Button(action: signIn)和Button(action: Signup)。继续TransitionView,我有:struct TransitionView: View { @StateObject var LocationModel = LocationViewModel() @State var userName = User(uid: "", email: "", userName: "") var body: some View { HomeView(LocationModel: LocationModel, userName: userName) } } -
需要添加
@State var userName =...和userName: userName
应用启动后,我可以使用用户名注册(并将其以 uid 作为文档存储在 Firestore 中),但未显示用户名。我认为问题一定出在用户(uid:“”,电子邮件:“”,密码:“”)。我不知道要在那里添加什么。
顺便说一句,我正在考虑维护代码,然后通过使用文档 id(已经是用户 uid)获取用户名,以便我可以访问它。目前还没有最终答案,但我正在努力。
EDIT2: 我添加了@StateObject var session = SessionStore()
尝试使用:
@State var userName = User(uid: SessionStore().session?.uid ?? "", email: SessionStore().session?.email ?? "", userName: SessionStore().session?.userName ?? "")
还是不行
【问题讨论】:
-
“但为此我需要链接两个视图”——这不是 SwiftUI 的工作方式。相反,在获取用户名时更新一些视图模型(一个 ObservableObject)。然后,设计要根据此值更新的视图,并带有条件,例如
if let userName = vm.userName { ContentView() } -
嘿@NewDeve,感谢您的回复。我不太明白你在说什么,我对 SwiftUI 有点陌生
-
@NewDev 我在这里问了另一个问题stackoverflow.com/questions/64859475/…(我添加了更多代码以方便理解)。试着在那里回答,这样我就可以删除这个了。