在我的应用程序中,我使用UserDefaults来存储用户的登录状态(不管他们是否已登录)以及他们的用户名。它工作正常,当我登录时,关闭应用程序,并再次打开我的应用程序跳过登录页面,并认识到我已经登录。虽然,我现在试图安装一个注销按钮到一个单独的viewController。单击时,此注销按钮需要1.)将UserDefaults.loginStatus重置为“False”2.)将UserDefaults.username重置为零3.)对登录页面执行segue。在其他视图控制器中访问Swift中的UserDefaults
以下是我的ViewController.swift文件中的相关代码。这是控制loginPage的第一个viewController。
import UIKit
import Firebase
let defaults = UserDefaults.standard
class ViewController: UIViewController {
func DoLogin(username: String, password: String) {
//I Am not including a lot of the other stuff that takes place in this function, only the part that involves the defaults global variable
defaults.setValue(username, forKey: "username")
defaults.setValue("true", forKey: "loginStatus")
defaults.synchronize()
self.performSegue(withIdentifier: "loginToMain", sender: self) //This takes them to the main page of the app
}
override func viewDidLoad() {
super.viewDidLoad()
if let stringOne = defaults.string(forKey: "loginStatus") {
if stringOne == "true" { //If the user is logged in, proceed to main screen
DispatchQueue.main.async
{
self.performSegue(withIdentifier: "loginToMain", sender: self)
}
}
}
}
以下是我在SecondViewController.swift中的代码,特别是注销功能。
import UIKit
import Firebase
class SecondViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let username = defaults.string(forKey: "username") {
checkAppSetup(username: username) //This is an unrelated function
//I included this because this works fine. Proving that I am able to read the defaults variable fine from this other viewController
}
}
@IBAction func logout(_ sender: Any) {
defaults.setValue("false", forKey: "username")
defaults.setValue("false", forKey: "loginStatus")
defaults.synchronize()
performSegue(withIdentifier: "logoutSegue", sender: nil)
}
注销函数运行时,segue执行正常,但默认值不会更改。有人可以解释为什么和我能做些什么来解决这个问题吗?
**注意,我实际上不会将默认值设置为“false”和“false”。这只是暂时的,因为我正在调试这个问题。
这里'defaults.setValue(“真”,forKey:“登录状态“)'你正在设置'true'。这是对的吗?为了调试目的?我猜它应该是'false' –
是的,这是我提出这个问题时的一个错误。在真实的代码中它确实会说“错误”。谢谢。但无论哪种方式,无论我在SecondViewController中设置它,在ViewController.swift –
中访问它时都不会出现。您可以在此行上设置断点“performSegue(withIdentifier:”logoutSegue“,sender:nil)'并在控制台中输入:'po UserDefaults.standard.value(forKey:“loginStatus”)'看看它会返回“true”还是“false”? –