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" 键注册了默认值
我使用 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:]
.