NSUserDefaults 将整数变量的默认值设置为空

NSUserDefaults set the default value of integer variable to empty

我使用 NSUserDefaults 来存储一个整数值。当我 运行 项目时,其中有一个默认值 0。如何删除 0 值?我只是希望它是空的,直到用户将内容放入其中。

这是我的代码:

    - (IBAction)save:(id)sender{
     int port = [[portField text] integerValue];

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
     [defaults setInteger:port forKey:@"port"];
     [defaults synchronize];
    }

    - (void)viewDidLoad {
     int port = [defaults integerForKey:@"port"];
     NSString *portString = [NSString stringWithFormat:@"%lu",(unsigned long)port];

     portField.text = portString;
     [super viewDidLoad];
    }

据我所知,NSUserDefaults 总是 return 原始类型的默认值,当它们不存在时。

如果默认值是您使用的有效值,我建议放置一个空白对象或仅放置 NSString 对象以确定关联值是否有效。例如

NSObject *objValid = [userDefaults objectForKey:@"integerIsValid"];
if(objValid != nil) {
    // User stored integer value exists.
    NSInteger i = [userDefaults integerForKey:@"SomeInteger"];
} else {
    // Have not saved integer value.
}

当用户保存整数值时,也保存关联对象:

[userDefaults setObject:[[NSObject alloc]init] forKey:@"integerIsValid"];
[userDefaults setInteger:i forKey:@"SomeInteger"];

更新

如果你的取值范围可以通过某种规则转换到另一个取值范围,那么你可以换一种方式。

所有值都在范围 [0, 100) 例如,您可以存储在范围 [1, 101) 并通过减去 1 来检索实际值。

嗯,这一行:

 int port = [defaults integerForKey:@"port"];

总是将 一些 值分配给 port

还有这个:

 NSString *portString = [NSString stringWithFormat:@"%lu",(unsigned long)port];

将始终生成非空字符串。您无法为将生成空字符串的 %lu 说明符传递任何值。

因此,您要做的是请求存储在首选项中的 对象,而不将其转换为整数值:

id portObject = [defaults objectForKey:@"port"];
if (portObject)
{
    NSInteger port;
    if ([portObject respondsToSelector:@selector(integerValue)])
        port = [portObject integerValue];
    else
    {
        // portObject is some unexpected class of object, such as an array or dictionary. Take some appropriate action. Or:
        port = 0;
    }
    portField.text = [NSString stringWithFormat:@"%ld", (long)port];
}
else
{
    // There was no value either stored or registered for the key "port"
    portField.text = @"";
}

请注意,要使其正常工作,您必须 而不是 已使用 -[NSUserDefaults registerDefaults:].

为 "port" 键注册了默认值