簡體   English   中英

在NSUserDefaults中存儲多個鍵值對

[英]Store multiple key-value pair in NSUserDefaults

我正在IOS(xcode 6.4)中建立一個簡單的登錄和注冊。 要保存用戶名和密碼,我正在使用NSUserDefaults 但是問題是我無法保存多個用戶名和密碼,因為我將數據保存到同一密鑰中。實現它的另一種方法是什么。我在stackoverflow上看到了類似的問題,但無法理解解決方案。 因此,任何人都可以輕松地進行解釋。 這是我的代碼:

//function for login pressed
- (IBAction)login:(UIButton *)sender 
{
    NSLog(@"%@,%@",userNameField.text,passwordField.text);

    username = [[NSUserDefaults standardUserDefaults] objectForKey:@"username"];
    password = [[NSUserDefaults standardUserDefaults] objectForKey:@"password"];
    NSLog(@"%@,%@",username,password);
    bool validUser = [username isEqualToString:userNameField.text];
    bool validPassword = [password isEqualToString:passwordField.text];

    if ([self checkWhetherFieldIsEmpty:userNameField.text :passwordField.text]) 
    {
        [self displayAlert:@"All Fileds are mandatory"];
    }
    else if(validUser && validPassword)
    {
        [self displayAlert:@"Successfull Login"] ;
    }
    else{
        // NSLog(@"Invalid username or password");
        [self displayAlert:@"Invalid login or password"];
    }

}

//function when register button is pressed
- (IBAction)register:(UIButton *)sender 
{
    if([[[NSUserDefaults standardUserDefaults] objectForKey:@"username"] isEqualToString:userNameField.text])
    {
        [self displayAlert:@"User already exist"];
        userNameField.text = @"";
        passwordField.text = @"";
    }
    else 
    {
        [[NSUserDefaults standardUserDefaults] setObject:userNameField.text forKey:@"username"];
        [[NSUserDefaults standardUserDefaults] setObject:passwordField.text forKey:@"password"];
        [[NSUserDefaults standardUserDefaults]synchronize];
        NSLog(@"user Created successfully");
        [self displayAlert:@"Registration Successfull"];
    }
}

正如Simon所指出的那樣,在NSUserDefaults存儲用戶名和密碼存在安全問題。 但是,如果您仍然想這樣做,那就很簡單。

NSUserDefaults實際上只是一個plist NSUserDefaults因此您可以在NSUserDefaults存儲從NSArrayNSDictionary創建的任意復雜結構。 因此,您可以執行以下操作:

NSArray<NSDictionary*>* accounts = @[@{
    @"username" : @"firstUsername",
    @"password" : @"firstPassword"
}, @{
    @"username" : @"secondUsername",
    "password" : @"secondPassword"
}];
[[NSUserDefaults standardUserDefaults] setObject: accounts forKey:@"accounts"];

請注意,您不能只更改一個帳戶。 如果需要更改或添加新帳戶,則應閱讀整個結構,將數組和字典轉換為可變的變體,然后將其全部重新寫入默認值。

更新

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray* mutableAccounts = [[defaults objectForKey:@"accounts"] mutableCopy];
// Add or remove accounts:
[mutableAccounts addObject:@{ @"username" : @"newAccount", @"password" : @"newPassword" }];
[mutableAccounts removeObjectAtIndex:0];
[defaults setObject:mutableAccounts forKey:@"accounts"];

您可以簡單地將密碼另存為密鑰用戶名的對象,有些人會這樣想:

- (IBAction)login:(UIButton *)sender {

    NSLog(@"%@,%@",userNameField.text,passwordField.text);

    NSString *password = userNameField.text.length > 0? [[NSUserDefaults standardUserDefaults] objectForKey:userNameField.text] : nil;
    bool validUser = passwordField.text.length > 0 ? [passwordField.text isEqualToString:password] : NO;

    if ([self checkWhetherFieldIsEmpty:userNameField.text :passwordField.text]) {
        [self displayAlert:@"All Fileds are mandatory"];
    }

    else if(validUser){

        [self displayAlert:@"Successfull Login"] ;


    }

    else{
        // NSLog(@"Invalid username or password");
        [self displayAlert:@"Invalid login or password"];
    }

}

//function when register button is pressed
- (IBAction)register:(UIButton *)sender {
    //TODO: need check userNameField passwordField is not nil here
    if([[[NSUserDefaults standardUserDefaults] objectForKey:userNameField.text] length] > 0){
        [self displayAlert:@"User already exist"];
        userNameField.text = @"";
        passwordField.text = @"";

    }
    else {
        [[NSUserDefaults standardUserDefaults] setObject:passwordField.text forKey:userNameField.text];
        [[NSUserDefaults standardUserDefaults]synchronize];
        NSLog(@"user Created successfully");
        [self displayAlert:@"Registration Successfull"];
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM