我有一个包含单个项目的设置包。该项目是一个设置为NO的开关。
我使用它来允许用户退出我想要的应用程序。但是,当用户打开应用程序然后进入设置并选择要在他们返回应用程序时注销的开关没有任何反应。如果他们返回设置再次切换它然后返回,然后正确输入if语句。
这几乎就像第一次没有读取设置但我不知道如何解决这个问题。
这就是我的代码:
- (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];
}
}
答案 0 :(得分:1)
用户默认值与其他容器类一样:它们将对象作为元素而不是标量类型。因此,您需要使用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];
答案 1 :(得分:0)
您发布的代码令人困惑。第一次运行应用程序(并且用户尚未进入设置并更改了切换),branchString
将nil
,应将其视为NO
。
您的代码应该是这样的:
- (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
声明没有任何意义,因为一旦用户将开关更改为开启,它就会成立,然后即使再次关闭开关也会为真。
旁注 - 为什么要让用户切换到“设置”应用,以便他们可以退出?为什么不能在您的应用中直接注销?这将是一个更好的用户体验。