如何在swift中使用用户默认值进行登录/注册和注销导航?



我有scenedelegate, appdelegate, signinVC, signupVC,和homeVC

视图控制器流程如下图

UINavigationController(initialVC) ->SigninVC (signin and signup buttons) -> homeVC(logoutBtn)

我需要当我登录或注册时,我需要移动homeVC,如果我注销,我需要回到loginVC,我需要用户自动登录,直到我在homeVC中点击注销按钮

在signupVC:

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)

}
}

在signinVC:

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", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
navigationController?.pushViewController(vc, 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)
}
}

在homeVC:

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", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
navigationController?.pushViewController(vc, 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开发的道路上好运。

最新更新