【问题标题】:Why doesn't NSUserDefault work with my dictionary object? [duplicate]为什么 NSUserDefault 不能与我的字典对象一起使用? [复制]
【发布时间】:2013-12-20 11:57:27
【问题描述】:

我为存储用户名和密码的假冒用户创建了一个对象,然后将该对象放入字典中。现在我正在尝试使用 NSUserDefault 存储字典,但它不让我。我理解最好不要使用 NSUserDefault 来存储用户数据,但这只是我正在尝试学习的初学者。

/**interface file **/
#import "newUser.h"

@interface BWViewController : UIViewController
{

    IBOutlet UITextField *userNameField;
    IBOutlet UITextField *passwordField;
    IBOutlet UILabel * loginStatus;

}

@property (nonatomic, copy) NSDictionary * aUser;

-(IBAction)signUpButton;

@end


/**implementation file**/


@interface BWViewController ()

@end

@implementation BWViewController

@synthesize aUser;

- (void)viewDidLoad
{
    [super viewDidLoad];

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

-(IBAction) signUpButton
{

    newUser * firstUser = [[newUser alloc] init];
    firstUser.userName = userNameField.text;
    firstUser.password = passwordField.text;

    NSLog(@"%@", firstUser.userName);  /**for testing**/
    NSLog(@"%@", firstUser.password);  /**for testing**/

    aUser = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:firstUser, nil] forKeys:[NSArray arrayWithObjects:userNameField.text, nil]];

    NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];

    [defaults setObject:aUser forKey:userNameField.text];
    [defaults synchronize];

    loginStatus.text = @"Thanks for signing up!";

}

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    更好的方法是存储两个用户默认值,一个用于用户名,一个用于密码:

    NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
    
    [defaults setObject:firstUser.userName forKey:@"USERNAME"];
    [defaults setObject:firstUser.password forKey:@"PASSWORD"];
    
    [defaults synchronize];
    

    它不起作用,因为您想使用带有自定义对象 (firstUser) 的 nsarray 存储 nsdictionary,但 NSUserDefaults 不允许您存储自定义对象。 希望对您有所帮助

    //扩展

    saveForKey:newUseFromKey: 我的意思是这样的:

    +(void)saveForKey:(NSString*)key
    {
        NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
    
        [defaults setObject:self.userName forKey:[NSString stringWithFormat:@"%@_USERNAME", key]];
        [defaults setObject:self.password forKey:[NSString stringWithFormat:@"%@_PASSWORD", key]];
        //.... other properties
    
        [defaults synchronize];
    }
    
    +(newUser)newUseFromKey:(NSString*)key
    {
        newUser * user = [[newUser alloc] init];
        NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
        user.userName = [defaults objectForKey:[NSString stringWithFormat:@"%@_USERNAME", key]];
        user.password = [defaults objectForKey:[NSString stringWithFormat:@"%@_PASSWORD", key]];
        //.... other properties
        return user;
    
    }
    

    如果您不存储太多 newUser 对象并且它们没有太多属性,这是一个很好的解决方案。 最好的选择是将所有对象放入数组/字典(由您决定,这两者之间没有最佳选择)并将其保存到文件中。请记住,如果要将自定义对象保存到文件系统,则必须实现 NSCoding 协议。

    【讨论】:

    • 感谢格雷格的信息。我想将所有内容存储在我的自定义对象(firstUser)中 - 诸如用户名、密码、位置、年龄等信息,并简单地使用用户名作为访问自定义对象及其所有包含数据的密钥。看起来编码是唯一的方法......
    • 您可以向您的类 (newUser) 添加两个方法 - saveForKey: 和 newUseFromKey: 将自己保存到用户默认值并从默认值创建对象。但是,如果您要保存大量对象,请不要使用 nsuserdefaults。您可以将对象添加到数组中并将其保存到文件中。
    • 不确定我理解你所说的 saveForKey: 和 newUseFromKey: 是什么意思?您认为最好将对象存储在数组中并将其保存到文件中?将对象保存在字典中,然后将字典保存到文件中不是更好吗?
    • @Brosef 查看编辑后的帖子。
    • 感谢您的解释!如果我想为我的对象添加其他属性,存储和检索用户信息的正确方法是什么?
    猜你喜欢
    • 2019-04-08
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多