Ios 使用NSUserDefault的应用程序设置不起作用
我有一个设置包,里面只有一个项目。该项是设置为“否”的开关 我使用它是为了允许用户注销我想要创建的应用程序。但是,当用户打开应用程序,然后转到设置并选择开关,以便在返回应用程序时注销,不会发生任何事情。如果它们返回到设置,请再次切换,然后返回,然后正确输入If语句 这几乎就像是设置不是第一次读取,但我不知道如何修复这个问题 这就是我的代码的样子:Ios 使用NSUserDefault的应用程序设置不起作用,ios,objective-c,nsuserdefaults,Ios,Objective C,Nsuserdefaults,我有一个设置包,里面只有一个项目。该项是设置为“否”的开关 我使用它是为了允许用户注销我想要创建的应用程序。但是,当用户打开应用程序,然后转到设置并选择开关,以便在返回应用程序时注销,不会发生任何事情。如果它们返回到设置,请再次切换,然后返回,然后正确输入If语句 这几乎就像是设置不是第一次读取,但我不知道如何修复这个问题 这就是我的代码的样子: - (void)applicationDidBecomeActive:(UIApplication *)application { NSUse
- (void)applicationDidBecomeActive:(UIApplication *)application
{
NSUserDefaults *settings = [NSUserDefaults standardUserDefaults];
NSNumber *branchString = [settings objectForKey:@"signout"];
NSLog(@"%@", branchString);
if ((branchString != nil) || (branchString != 0)) {
// turn signout back on.
[settings setObject:NO forKey:@"signout"];
[settings synchronize];
}
}
用户默认值与其他容器类类似:它们将对象作为元素,而不是标量类型。因此,您需要用一个
NSNumber
来包装标量类型(BOOL):
[settings setObject:[NSNumber numberWithBool:NO] forKey:@"signout"];
// with modern syntax
[settings setObject:@(NO) forKey:@"signout"];
但听起来像是从开关中获取值,因此无法使用新的文字语法,即:
[settings setObject:[NSNumber numberWithBool:self.mySwitch.on] forKey:@"signout"];
请记住,当从默认值读回时,需要展开包装的缩放器,如下所示:
self.mySwitch.on = [[settings objectForKey:@"signout"] boolValue];
- (void)applicationDidBecomeActive:(UIApplication *)application
{
NSUserDefaults *settings = [NSUserDefaults standardUserDefaults];
BOOL signout = [settings boolForKey:@"signout"];
NSLog(@"%d", signout); // will be 0 (NO) or 1 (YES)
if (signout) {
// The user has changed the switch to on
// turn signout back off.
[settings setBool:NO forKey:@"signout"];
[settings synchronize];
} else {
// The user has either changed the switch to off or it is still off by default
}
}
你发布的代码令人困惑。第一次运行应用程序时(且用户尚未进入设置并更改开关),
branchString
将为nil
,应视为NO
您的代码应该是这样的:
self.mySwitch.on = [[settings objectForKey:@"signout"] boolValue];
- (void)applicationDidBecomeActive:(UIApplication *)application
{
NSUserDefaults *settings = [NSUserDefaults standardUserDefaults];
BOOL signout = [settings boolForKey:@"signout"];
NSLog(@"%d", signout); // will be 0 (NO) or 1 (YES)
if (signout) {
// The user has changed the switch to on
// turn signout back off.
[settings setBool:NO forKey:@"signout"];
[settings synchronize];
} else {
// The user has either changed the switch to off or it is still off by default
}
}
原始的if
语句没有任何意义,因为一旦用户将开关更改为on,它将为真,然后,即使用户再次关闭开关,它也将为真
旁注-为什么要让用户切换到设置应用程序,以便他们可以注销?为什么不在应用程序中提供注销功能?这将是一个更好的用户体验。您也可以使用缩写形式@(NO),或者只使用@NO。很难解释,但我会尝试。目前,当我第一次访问NSUserDefault时,这些值不可用。因此,当我第一次注销时,它没有被看到。我退出应用程序,第二次返回应用程序,然后我的代码开始工作。是的,关于你的例子,我的代码被破坏了,但是现在开关被正确重置,它永远不会注销,因为当我第一次使用它时,它会立即切换回“否”。第二次登录时,什么也没有发生。我不知道为什么会发生这种情况。@HurkNburkS-不太明白你的意思,但请记住,在读取和设置开关值时(或无论你用它做什么),你必须打开对象。“请看我的编辑。”我很高兴。是的,谢谢。虽然在这种情况下,新的文字语法可能不适用于OP。请参阅我的编辑。@danh为什么不认为只要涉及到
UISwitch
就可以使用@NO
<代码>[NSNumber numberWithBool:NO]和@NO
是一回事。