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

时间:2015-10-19 01:10:21

标签: objective-c nsuserdefaults

我使用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];
    }

2 个答案:

答案 0 :(得分:2)

好吧,这一行:

 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”键注册默认值。

答案 1 :(得分:1)

据我所知,NSUserDefaults总是在原始类型不存在时返回默认值。

如果默认值是您使用的有效值,我建议放置一个空白对象或只是NSString对象来确定相关值是否有效。 e.g。

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来检索实际值。