如果新用户注册成功,如何打开一个屏幕,当现有用户使用 SwiftUI 成功登录时如何打开另一个屏幕?
Posted
技术标签:
【中文标题】如果新用户注册成功,如何打开一个屏幕,当现有用户使用 SwiftUI 成功登录时如何打开另一个屏幕?【英文标题】:How open one screen if a new user registered successfully, and other when existing user logged in succesfully using SwiftUI? 【发布时间】:2020-04-18 09:34:09 【问题描述】:我正在使用 Firebase Auth 通过电子邮件和密码处理登录和注册页面。
成功完成了什么:
如果会话(登录或注册)不是nil,则用户转到欢迎返回视图。
接下来是问题:
我不希望新用户去“欢迎回来”查看,而是希望他在按下“注册”按钮后(会话不是nil 转到新视图 - “上传您的照片视图”
我的会话存储类 (@ObservableObject):
@Published var session: User? didSetself.didChange.send(self)
var didChange = PassthroughSubject<SessionStore, Never>()
var handle: AuthStateDidChangeListenerHandle?
let currentuser = Auth.auth().currentUser
func listen()
handle = Auth.auth().addStateDidChangeListener((auth, user) in
if let user = user
self.session = User(uid: user.uid, email: user.email)
else
self.session = nil
)
func signUp(email: String, password: String, fullname: String, username: String, handler: @escaping AuthDataResultCallback)
Auth.auth().createUser(withEmail: email, password: password, completion: handler)
func signIn(email: String, password: String, handler: @escaping AuthDataResultCallback)
Auth.auth().signIn(withEmail: email, password: password) (res,err) in
if err != nil
return
func signOut()
do
try Auth.auth().signOut()
self.session = nil
catch
print("Error signing out")
func unbind()
if let handle = handle
Auth.auth().removeStateDidChangeListener(handle)
deinit
unbind()
func addUsername(username: String)
session?.username = username
func addFullname(fullname: String)
session?.fullname = fullname
class User:ObservableObject
var uid: String
var email: String?
var username: String?
var fullname: String?
init(uid:String, email:String?)
self.uid = uid
self.email = email
我的内容视图看起来像这样:
组 if (session.session != nil)
Button(action:
try! Auth.auth().signOut()
UserDefaults.standard.set(false, forKey: "status")
NotificationCenter.default.post(name: NSNotification.Name("statusChange"), object: nil)
)
Text("Log out")
ExploreView()
else
AuthView()
.onAppear(perform: getUser)
【问题讨论】:
嗨,Maksym,你能澄清你的问题吗?我不确定你想要达到什么目标。关于您的SessionStore
:您不需要直接使用PassthroughSubject
- 实现ObservableObject
并使用@Published
标记您想要观察的任何属性就足够了。查看 peterfriese.dev/replicating-reminder-swiftui-firebase-part3 了解使用 Sign in with Apple 的 Firebase 身份验证实施,了解 SwiftUI 和 Firebase 的一些最佳实践。
嘿,彼得!感谢您的回答!我的目标是向新用户和老用户展示不同的视图。但现在如果他们已登录,我只能向他们显示一个屏幕。
让老用户进入主页(如果已登录)和新用户(刚刚注册的用户)去添加照片屏幕。我只是不知道如何将它们分开来实现它。
您是否考虑过使用lastSignInDate
或creationDate
?在此处查看文档:firebase.google.com/docs/reference/swift/firebaseauth/api/…
谢谢,还没有,但会尝试!
【参考方案1】:
一种可能的解决方案是双向绑定,仅在注册成功时触发(因此它是那一刻的第一次登录)。
编辑您的评论:在 signUp-func 中,当 signUp 成功时,您将变量设置为“true”,PhotoUploadView 将弹出。
在 User 类中添加一个变量(然后可以在您的变量会话中使用):
@Published var firstLogin = false
注册成功后在signUp-func中更改firstLogin:
session.firstLogin = true
在 ContentView 中使用类似的东西:
//.....
else
if session.firstLogin
PhotoUploadView()
在 PhotoUploadView 中完成后,将 session.firstLogin 设置为 false。
【讨论】:
嗨,@Kuhlemann!非常感谢您的回答!我刚刚上传了我的 ContentView 代码。 查看我的更新答案以了解如何做。 一直在尝试解决它们,但每次都只会出现更多。这些是我在 ContentView 中收到的错误:1)无法将“Binding以上是关于如果新用户注册成功,如何打开一个屏幕,当现有用户使用 SwiftUI 成功登录时如何打开另一个屏幕?的主要内容,如果未能解决你的问题,请参考以下文章