ios - Firebase SwiftUI 的首次登录弹出窗口
问题描述
我正在尝试制作一项功能,以在用户第一次使用 Firebase 登录时显示弹出窗口,但打印时它不起作用。打印时在所有情况下都返回 false
很高兴知道,这些帐户是从控制台创建的!
AuthView.swift
func on_connect() {
if self.email != "" && self.pass != "" {
Auth.auth().signIn(withEmail: self.email, password: self.pass) { (res, err) in
if err != nil {
self.error = err!.localizedDescription
self.alert.toggle()
return
}
if res?.additionalUserInfo?.isNewUser == true{
print("IM NEW!")
UserDefaults.standard.set(true, forKey: "status")
NotificationCenter.default.post(name: NSNotification.Name("status"), object: nil)
}
else{
UserDefaults.standard.set(true, forKey: "status")
NotificationCenter.default.post(name: NSNotification.Name("status"), object: nil)
}
}
}
}
感谢您的宝贵帮助!
解决方案
问题 #1:
你有两个delivViewModel
s:
@ObservedObject private var viewModel = delivViewModel()
@ObservedObject var first_log: delivViewModel
第一个是在内部创建LoggedView
的,第二个看起来像是通过参数传入的。很难想象你需要两者的场景,所以摆脱它们中的一个,这样你就不会最终在两者上调用函数,稍后会发生这种情况:
self.viewModel.is_first_loggin() // called on viewModel
print("first sign in-> \($first_log.first_log)") // called on first_log
问题 #2:
Auth.auth().signIn
,就像几乎所有网络功能一样,是异步的。这意味着它不会立即返回(它将在未来的某个不确定的时间点返回),因此代码会在它自己完成之前 signIn
完成之后直接运行。但是,回调函数/闭包中的代码(您在{}
after中看到的signIn
)将在完成后被调用。
在打印值方面,我只需将该代码移动到回调函数中。你会有:
Auth.auth().signIn(with: credential) { (result, error) in
if error == nil {
if result?.additionalUserInfo!.isNewUser == true {
self.first_log = true
} else {
self.first_log = false
}
print("First log in? \(self.first_log)")
}
}
在显示您提到的弹出窗口方面,您可以有条件地显示$viewModel.first_log
(这是假设您选择viewModel
成为delivViewModel
您想要保留的。
就像是:
.sheet(isPresented: $viewModel.first_log) {
Text("Popup stuff")
}
如果您确实想要一种first_log
在异步设置后在视图中响应的方法,您还可以查看onReceive
(如何在 SwiftUI 中使用 onReceive 从 ObservedObject 获取数据?),但是这里可能没有它的用例(除非您要返回 UIKit 以命令式地显示弹出窗口或其他内容)。
推荐阅读
- node.js - 错误未知或重复参数:NodeCommand
- concurrency - 在原子调用中支持多次获取的计数信号量 - 这将如何根据其他原语实现?
- flutter - 在 moor 数据库中输入长日期时间或日期的类型转换 - 颤振
- python - 从小提琴图中删除异常值
- c# - 如何将不断增长的递归数学函数转换为代码?
- angular - Angular-禁用按钮,直到选择下拉选项
- date-fns - 如何解析具有时区偏移的旧 MS JSON 日期
- hibernate - Convert(DATE, expr) 使用 CriteriaBuilder for Sql server 实现
- r - 删除包括第三个连字符在内的字符
- python - 如何在pygame中随机生成多个对象