我有一个登录屏幕LoginViewController
和主屏幕HomeScreenController
,在用户成功登录后会被按下)。
我在一个单独的类中为UserDefaults声明了一个变量,如下所示:
class User {
static var isLoggedIn = UserDefaults.standard.bool(forKey:"islogged")
}
用户单击登录按钮时,代码如下所示
ButtonAction:
{
User.isLoggedin = true
//Performsegue........to homescreen
}
ViewDidload {
if user.isloggedin == true {
//Performsegue......homescreen
}
else {
Show some alerts
}
}
在我的情况下...什么都没有发生...抱歉,因为我正在使用智能手机问这个问题,所以粗糙的代码。
我在appdelegate或其他地方缺少什么吗? 我只想按原样使用变量,因为我不想更改项目中的整个代码。 该项目实际上很复杂,我只是举了一个例子让大家了解我的情况。 这不是确切的代码。
答案 0 :(得分:3)
对UserDefaults
值使用带有静态变量的类是不好的做法。除此之外,静态变量不会更新UserDefaults
中的值。
在按钮操作中,设置UserDefaults
中的值并执行segue
@IBAction func login(_ sender : Any) {
UserDefaults.standard.set(true, forKey:"islogged")
performSegue(...
}
在viewDidLoad
中直接从UserDefaults
获取值
func viewDidLoad() {
super.viewDidLoad()
if UserDefaults.standard.bool(forKey:"islogged") {
performSegue(...
} else {
// present error
}
}
答案 1 :(得分:0)
我认为这正在发生,因为您正在User
类中调用UserDefaults。在初始化类之前,不会执行此操作。
尝试直接在viewDidLoad()
中执行此操作,它应该可以工作。
if UserDefaults.standard.bool(forKey:"islogged") {
Performsegue......homescreen
}else{
Show some alerts
}
答案 2 :(得分:0)
尝试用此方法代替您的isLoggedIn代码行
static var isLoggedIn: Bool {
get {
return UserDefaults.standard.bool(forKey: "isLoggedIn")
}
set {
UserDefaults.standard.setValue(newValue, forKey: "isLoggedIn")
UserDefaults.standard.synchronize()
}
}
答案 3 :(得分:0)
我认为您可能正在尝试实现这一目标:
class User {
static var isLoggedIn: Bool {
get {
return UserDefaults.standard.bool(forKey: "islogged")
}
set(aIsLoggedIn) {
UserDefaults.standard.set(aIsLoggedIn, forKey: "islogged")
}
}
}
您的代码存在的问题是您没有保存isLoggedIn
的状态,因此在每次启动时,该值始终为false
答案 4 :(得分:0)
我相信您在致电performSegue:
时遇到问题。您无法在viewDidLoad
上调用此方法,因为尚未完全设置视图控制器。尝试将viewDidLoad
移至viewDidAppear
将viewDidLoad代码移至viewDidAppear
override func viewDidAppear(animated: Bool){
super.viewDidAppear(animated)
if User.isLoggedIn{
performSegue("someIdentifier")
}else{
//show some alerts.
}
}
此外,请为您的isLoggedIn
使用计算所得的var。
取自马可:
static var isLoggedIn: Bool {
get {
return UserDefaults.standard.bool(forKey: "islogged")
}
set(aIsLoggedIn) {
UserDefaults.standard.set(aIsLoggedIn, forKey: "islogged")
}
}
答案 5 :(得分:0)
在您的代码中
class User {
static var isLoggedIn = UserDefaults.standard.bool(forKey:"islogged")
}
'isLoggedIn'只是一个值类型。它不会因UserDefaults.standard的某些值而改变。因为您的声明只是为此设置了默认值,所以如果您想拥有一个隐含全局唯一语义的变量,则必须确保在相同的地址处对其进行修改,并从相同的地址处进行获取。
答案 6 :(得分:0)
我认为如果用户已登录,则需要隐藏登录vc,对吗?
在HomeVC中完成
@IBAction func login(_ sender : Any) {
if login == true{
UserDefaults.standart.set("true", forKey:"islogged")
}
}
并将其粘贴到AppDelegate
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
self.window = UIWindow(frame: UIScreen.main.bounds)
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
var initialViewController: UIViewController
if UserDefaults.standard.string(forKey: "islogged") == "true"//your condition if user is already logged in or not
{
// if already logged in then redirect to MainViewController
initialViewController = mainStoryboard.instantiateViewController(withIdentifier: "HomeVC") as! UITabBarController // 'MainController' is the storyboard id of HomeViewController
}
else
{
//If not logged in then show LoginViewController
initialViewController = mainStoryboard.instantiateViewController(withIdentifier: "LoginVC") as! SignInViewController // 'LoginController' is the storyboard id of LoginViewController
}
self.window?.rootViewController = initialViewController
self.window?.makeKeyAndVisible()
return true
}