swift - 如何为用户输入设置 UserDefaults 并检索该值以用于异步 Firebase 身份验证功能?
问题描述
目前我正在使用适用于 iOS 的 Firebase 电子邮件链接身份验证,我的第一个身份验证方法 sendsigninlink:toEmail 工作并将电子邮件从用户注册输入发送到电子邮件。但是我目前无法在本地捕获电子邮件输入以在另一个视图控制器中用于另一个异步功能。我尝试在此处的按钮 IBAction 方法中设置电子邮件值。
@IBAction func EmailValidate(_ sender: Any) {
let emailvalidation = EmailField.text ?? ""
if emailvalidation.isValidEmail(){
let _ = UserDefaults.standard
let _ = UserDefaults.standard.set(emailvalidation, forKey: "Email")
return
} else {
let invalidEmailAlert = UIAlertController(title: "Invalid Email", message: "Please fill in a valid e-mail.", preferredStyle: .alert)
let invalidEmailAlertAction = UIAlertAction(title: "OK", style: .default, handler: nil)
invalidEmailAlert.addAction(invalidEmailAlertAction)
self.present(invalidEmailAlert, animated: true, completion: nil)}}
isValidEmail() 只是一个验证电子邮件文本的正则表达式函数,如果电子邮件有效,UserDefaults 应该捕获该值以供我在另一个视图控制器中使用。这是另一个视图控制器中包含异步方法的函数
func handlePasswordlessSignIn(_ url: URL){
let emailvalue = UserDefaults.value(forKey: "Email") as? String
Auth.auth().signIn(withEmail: emailvalue! , link: link) { (user, error) in
if error == nil && user != nil {
if (Auth.auth().currentUser?.isEmailVerified)!{
print("User verified")
} else {
print("User not verified")
}
}
}
}
解决方案
当您存储正确UserDefaults.standard
用于将其存储在共享默认对象中的数据时,但是当您尝试检索它时,您错过了.standard
并且实际上正在调用与获取存储在 UserDefaults 中的数据无关的方法。
要修复,请更改此:
let emailvalue = UserDefaults.value(forKey: "Email") as? String
对此:
let emailvalue = UserDefaults.standard.string(forKey: "Email")
推荐阅读
- python - 垂直和水平汇总列表字典的Pythonic方法
- python - PyQt:如何更新 QLabel 文本(从另一个 python 文件/函数访问 QT 小部件)?
- javascript - 在 Google 地图中隐藏 MarkerClusterer?
- c# - AllowXRequestsEveryXSecondsAttribute 的程序集和命名空间是什么?
- java - 如何在 Android 中使用 Retrofit 从服务器下载 PDF 文件?
- ios - 在一个 ScrollView 中缩放和分页
- excel - 我可以记录excel中单元格中的每个数据吗(从我选择的时间开始)
- javascript - 从添加到隐藏字段的值中删除逗号
- css - clip-path 和 shape-outside 属性之间的区别
- login - API 平台 + Nuxt - 会话管理