如何在 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 的道路上好运发展。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...