79

当我的应用程序的rootViewController被加载时,我希望能够检查用户登录凭证是否已被保存到NSUserDefaultsiOS:在NSUserDefaults中使用布尔值

基本上,当用户加载应用程序并且他/她没有保存她的登录凭证时,modalAlertView将被推送,并且用户将能够适当地保存他们的凭证。这将这些UITextField字符串保存到各自的NSUserDefault对象。但是,是否有可能在完成此保存时创建一个NSUserDefault对象,它是一个布尔值,并将该值更改为yes?

这意味着布尔值已经设置为no,并且当用户保存他们的登录凭证时,它也会将布尔值更改为yes?

回答

245

您可以通过设置布尔型:

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"logged_in"]; 

,并通过使用此代码阅读:

if(![[NSUserDefaults standardUserDefaults] boolForKey:@"logged_in"]) { 
    [self displayLogin]; 
} else { 
    [self displayMainScreen]; 
} 
+7

妈的你是好! – 2010-10-01 16:35:12

+0

@Henril P。可以显示先前登录过的用户 – Ajay 2011-08-11 10:25:50

2

首先将它设置为NO你不需要,而是你可以检查如果一个密钥已被设置。如果没有,并且您的应用程序确定凭据已完成,请创建它并将其设置为YES

检查my answer to another question看看我通常如何做到这一点。

10

NSUserDefaults有一个方法叫registerDefaults:。您可以使用此方法设置应用程序的“默认默认值”。基本上,您创建一个包含您的默认密钥和值的NSDictionary(在您的情况下,“已保存凭据”密钥的NO),并使用registerDefaults:注册。这通常在应用代理的+ (void)initialize方法中完成,以确保您的默认设置在需要之前进行注册。如果您的应用没有替换它们,这些值才会被使用。换句话说,除非您要查找的密钥不在应用程序域中,否则它们将不会被使用,即用户默认从用户的.plist文件中读取。

另一方面,您可以检查登录凭据并在缺失时弹出警告。这消除了保持布尔值与登录凭证同步的需要。如果稍后提供“删除登录凭据”功能,则不必记得将布尔值设回为NO。如果您的登录凭据保存在用户的默认设置,你可以这样做:

​​
+0

如何编写一个方法来检查登录凭证,并在未保存时弹出警报? – 2010-10-01 16:51:59

+0

查看更新的答案。 – 2010-10-01 16:59:37

+4

你甚至不应该考虑将密码存储在NSUserDefaults中。 – 2014-05-13 18:35:48

5

该解决方案,亨里克·P. Hessel的建议:

if(![[NSUserDefaults standardUserDefaults] boolForKey:@"logged_in"]) { 
[self displayLogin]; 
} else { 
[self displayMainScreen]; 
} 

会在你的情况下工作,但牢记如果设置了某个键,则不应使用此代码进行检查,因为如果它实际上已设置并设置为“NO”,那么仍然会得到一个结果,就好像根本没有设置。相反,我会用

if([[NSUserDefaults standardUserDefaults] objectForKey:@"logged_in"] == nil) { 
    //Do something 
} 
-1

斯威夫特2。3

存储值

NSUserDefaults.standardUserDefaults().setBool(false, forKey: "logged_in") 

有关读取值

if NSUserDefaults.standardUserDefaults().boolForKey("logged_in") == true { 
     dashboardScreen() 
    }else { 
     loginScreen() 
    } 

夫特3.0

存储值

UserDefaults.standard().setBool(true, forKey: "logged_in") 

检索值

UserDefaults.standard().bool(forKey: "logged_in"){ 
     dashboardScreen() 
    }else { 
     loginScreen() 
    } 
0

斯威夫特3

let Defaults = UserDefaults.standard()() 
let exists = Defaults.bool(forKey: "isLoggedIn") 

if !exists { 
    displayLoginScreen()    
} else { 
    print("value exists..do something") 
    displayMainScreen()  
}  

或者我们可以用object(forKey:)然后将它转换为bool

if let exists = Defaults.object(forKey: "isLoggedIn"), let isLoggedIn = exists.boolValue where isLoggedIn == true { 
    displayMainScreen() 
} else { 
    displayLoginScreen() 
}