如何从NSUserDefaults中读取字符串

8

我有一个存储对象和键(其中一个是用户文本字段输入)的plist根对象。 我没有问题编写和创建结构; 尝试读取值会导致问题。 以下代码用于编写数据,有人可以告诉我如何读取字符串[ val ]和[ myKey ]吗?

谢谢!

#define defaultValue @"Your Name"
#define myKey @"PersonName"

- (void)textFieldAction:(id)sender {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *val;

    // Get the new value from the textfield

    val = [myTextField stringValue];

    if ([val isEqualToString:defaultValue]) {
        [defaults removeObjectForKey:myKey];
    } else {
        // [defaults setObject:val forKey:myKey];

    NSDictionary *my_dict = [NSDictionary dictionaryWithObjectsAndKeys:
                             @"Name", @"PersonName",
                             @"Email", @"PersonEmail", 
                             @"Dept", @"PersonDept", 
                             @"Job", @"PersonJob", 
                             val, myKey, 
                             @"Status", @"PersonStatus", 
                             nil];

    [defaults setObject: my_dict forKey: @"Person"];

    [[NSUserDefaults standardUserDefaults] registerDefaults:my_dict];

我希望能够自动填充文本字段,使用 [myKey] 的 [val],如果用户已经在 plist 中拥有了这些信息。下面是我用于实现此功能的代码:
- (void)applicationDidFinishLaunching:(NSNotification *)notification {

    NSUserDefaults *defaults = [[NSUserDefaults standardUserDefaults] objectForKey:myKey];
    NSString *val = [defaults stringForKey:myKey];

    if (val == nil) val = defaultValue;
    [myTextField setStringValue:val];

这段代码是否能够编译通过? - sch
嘿,是的,它没有问题,那就不会太糟糕了,对吧?:-p - Devon
这不是iOS应用程序,而是OS X。 - Devon
在我的.h文件中,它是**IBOutlet NSTextField *myTextField;**。 - Devon
好的,你还有问题吗? - sch
3个回答

34

您可以按照以下方式将值写入 NSUserDefault

[[NSUserDefaults standardUserDefaults] setValue:[myTextField stringValue] forKey:@"Person"];

然后可以像以下方式稍后阅读:

[myTextField setStringValue:[[NSUserDefaults standardUserDefaults] stringForKey:@"Person"];

你可以简化你的代码为:

- (void)textFieldAction:(id)sender {
    [[NSUserDefaults standardUserDefaults] setValue:[myTextField stringValue] forKey:@"Person"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

您可以使用registerDefaults:方法设置默认值。然后,您只需调用以下代码即可检索该值:

- (void)applicationDidFinishLaunching:(NSNotification *)notification
{
    // ...
    [[NSUserDefaults standardUserDefaults] registerDefaults:@{@"Person", defaultValue}]
    NSString *value = [[NSUserDefaults standardUserDefaults] stringForKey:@"Person"];
    [myTextField setStringValue:value];
    // ...
}

它不喜欢 .text - 我得到一个错误:“在 NSTextField * 类型的对象上找不到属性 'text'”。 - Devon
是的,当您说它不是iOS应用程序时,我将其更改为setStringValue :) - sch
太棒了!完美地运作了...非常感谢!;-)我会点赞你的回答,尽管显然我没有足够的影响力。再次感谢,真的很感激。 - Devon

2

如果我理解正确,你只需要简单地执行以下操作即可完成所需的任务:

NSString * val = [[NSUserDefaults standardUserDefaults] objectForKey: myKey];
[textfield setText: val];

NSUserDefaults Reference Page


它在上面我定义的文本字段中输出默认值“Your Name”,但是,如果该人之前输入了他们的姓名,它应该读取并使用该信息填充文本字段。不幸的是,它总是输出“Your Name”,因此显然没有正确读取,因为该名称存储在plist中。 - Devon
由于它是一个直接来自框架的函数,所以很不可能读取不正确。更有可能的是您正在错误地设置它。很难说,因为您发布的代码显然不是整个代码 - 它甚至无法编译。我猜测您实际上设置了两次值 - 首先是通过[defaults setObject ...],然后是通过注册字典。 您只应该执行一次。 - Peter Sarnowski

1
myTextField.text = [[NSUSerDefaults standardUserDefaults] objectForKey:myKey];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接