如何解决如何在 swift 中使用 userdefaults 进行登录/注册和注销导航?
我有scenedelegate、appdelegate、signinVC、signupVC和homeVC
viewcontroller 流程如下
UINavigationController(initialVC) ->SigninVC (signin and signup buttons) -> homeVC(logoutBtn)
我需要当我登录或注册时我需要移动 homeVC,如果我注销我需要回到 loginVC 并且我需要用户自动登录直到我在 homeVC 中点击注销按钮
在注册VC:
class RegisterViewController: UIViewController {
@IBOutlet weak var firstNameTextfield: UITextField!
@IBOutlet weak var lastNameTextfield: UITextField!
@IBOutlet weak var emailTextfield: UITextField!
@IBOutlet weak var passwordTextfield: UITextField!
@IBAction func registerBtnClicked(_ sender: Any) {
if firstNameTextfield.text?.isEmpty == true{
self.showAlert(title: "Registration",message: "please enter first name")
}
else if lastNameTextfield.text?.isEmpty == true{
self.showAlert(title: "Registration",message: "please enter last name")
}else if emailTextfield.text?.isEmpty == true{
self.showAlert(title: "Registration",message: "please enter email")
}else if passwordTextfield.text?.isEmpty == true{
self.showAlert(title: "Registration",message: "please enter password")
}
else{
UserDefaults.standard.set(firstNameTextfield.text,forKey: "userName")
UserDefaults.standard.set(lastNameTextfield.text,forKey: "lastName")
UserDefaults.standard.set(emailTextfield.text,forKey: "email")
UserDefaults.standard.set(passwordTextfield.text,forKey: "userPassword")
let storyboard = UIStoryboard(name: "Main",bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
navigationController?.pushViewController(vc,animated: true)
}
}
在登录VC中:
class ViewController: UIViewController {
@IBOutlet weak var userNameTextfield: UITextField!
@IBOutlet weak var passwordTextfield: UITextField!
@IBAction func loginBtnClicked(_ sender: Any) {
let uName = UserDefaults.standard.string(forKey: "userName")
let uPassword = UserDefaults.standard.string(forKey: "userPassword")
if userNameTextfield.text == uName && passwordTextfield.text == uPassword{
UserDefaults.standard.set(true,forKey: "USER_LOGIN")
let storyboard = UIStoryboard(name: "Main",animated: true)
}
else{
showAlert(title: "LogIn",message: "please enter username and password")
}
}
@IBAction func registerBtnClicked(_ sender: Any) {
let storyboard = UIStoryboard(name: "Main",bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "RegisterViewController") as! RegisterViewController
navigationController?.pushViewController(vc,animated: true)
}
}
在家庭VC中:
class HomeViewController: UIViewController {
@IBAction func logoutBtnClicked(_ sender: Any) {
UserDefaults.standard.set(false,forKey: "USER_LOGIN") //logging session off
let storyboard = UIStoryboard(name: "Main",bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
navigationController?.pushViewController(vc,animated: true)
}
}
如何登录所有注册用户以及如何在我点击注销按钮之前自动登录到主页..请帮忙提供代码
解决方法
在 signinVC 的 viewDidLoad 中添加以下行
if UserDefaults.standard.bool(forKey: "USER_LOGIN"){
//navigate to home page
DispatchQueue.main.async {
let storyboard = UIStoryboard(name: "Main",bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
navigationController?.pushViewController(vc,animated: true)
}
}
修改signupVC如下
class RegisterViewController: UIViewController {
@IBOutlet weak var firstNameTextfield: UITextField!
@IBOutlet weak var lastNameTextfield: UITextField!
@IBOutlet weak var emailTextfield: UITextField!
@IBOutlet weak var passwordTextfield: UITextField!
var userDict : Dictionary<String,UserData>?
@IBAction func registerBtnClicked(_ sender: Any) {
if firstNameTextfield.text?.isEmpty == true{
self.showAlert(title: "Registration",message: "please enter first name")
}
else if lastNameTextfield.text?.isEmpty == true{
self.showAlert(title: "Registration",message: "please enter last name")
}else if emailTextfield.text?.isEmpty == true{
self.showAlert(title: "Registration",message: "please enter email")
}else if passwordTextfield.text?.isEmpty == true{
self.showAlert(title: "Registration",message: "please enter password")
}
else{
self.userDict = UserDefaults.standard.dictionary(forKey: "UserList") as! Dictionary<String,RegisterViewController.UserData>
let userData = UserData(userName: firstNameTextfield.text,lastName: lastNameTextfield.text,email: emailTextfield.text,userPassword: passwordTextfield.text)
self.userDict[firstNameTextfield.text] = userData
UserDefaults.standard.setValue(self.userDict,forKey: "UserList")
DispatchQueue.main.async {
let storyboard = UIStoryboard(name: "Main",bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
navigationController?.pushViewController(vc,animated: true)
}
}
}
struct UserData {
var userName : String
var lastName : String
var email : String
var userPassword : String
}
最后修改 loginBtnClicked 方法如下
@IBAction func loginBtnClicked(_ sender: Any) {
let userDict = UserDefaults.standard.dictionary(forKey: "UserList") as! Dictionary<String,UserData>
guard let usrData = userDict[userNameTextfield.text] as! UserData else {
// no user registered with this user name
return
}
if usrData.userPassword == passwordTextfield.text {
// login successfull
UserDefaults.standard.set(true,forKey: "USER_LOGIN")
DispatchQueue.main.async {
let storyboard = UIStoryboard(name: "Main",animated: true)
}
}else{
//login failed
showAlert(title: "LogIn",message: "please enter username and password")
}
}
,
我绝对建议您阅读一些有关 MVC 或 MVVM 架构的文章:) (https://marcosantadev.com/mvvmc-with-swift/)
我知道您可能只是在期待问题的答案,所以最简单的方法是(而不是正确的方法!!):
您可以将 bool
参数保存到 userDefaults,这将指示用户是否已登录。 ()
启动应用后,您可以检查参数是否存在于 UserDefaults 中,并根据该参数将用户导航到所需的控制器。
如果 UserDefaults 中的值发生变化,您也可以添加一个观察者,并根据更改再次将用户导航。
正如我之前提到的,我不确定你在创建什么(如果它是某种应用程序或只是培训),但肯定阅读了一些关于架构的文章并尝试使用一个:) 祝你在学习 iOS 的道路上好运发展。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。