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() 
} 
相關問題