我使用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];
}
答案 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来检索实际值。