如何在 swift 中使用 userdefaults 进行登录/注册和注销导航?
How to do signin / signup and logout navigation using userdefaults in swift?
我有 scenedelegate、appdelegate、signinVC、signupVC 和 homeVC
viewcontroller 流程如下
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)
}
}
登录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", 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发展。
我有 scenedelegate、appdelegate、signinVC、signupVC 和 homeVC
viewcontroller 流程如下
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)
}
}
登录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", 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发展。