Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用NSUserDefault的应用程序设置不起作用_Ios_Objective C_Nsuserdefaults - Fatal编程技术网

Ios 使用NSUserDefault的应用程序设置不起作用

Ios 使用NSUserDefault的应用程序设置不起作用,ios,objective-c,nsuserdefaults,Ios,Objective C,Nsuserdefaults,我有一个设置包,里面只有一个项目。该项是设置为“否”的开关 我使用它是为了允许用户注销我想要创建的应用程序。但是,当用户打开应用程序,然后转到设置并选择开关,以便在返回应用程序时注销,不会发生任何事情。如果它们返回到设置,请再次切换,然后返回,然后正确输入If语句 这几乎就像是设置不是第一次读取,但我不知道如何修复这个问题 这就是我的代码的样子: - (void)applicationDidBecomeActive:(UIApplication *)application { NSUse

我有一个设置包,里面只有一个项目。该项是设置为“否”的开关

我使用它是为了允许用户注销我想要创建的应用程序。但是,当用户打开应用程序,然后转到设置并选择开关,以便在返回应用程序时注销,不会发生任何事情。如果它们返回到设置,请再次切换,然后返回,然后正确输入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];
    }
}

用户默认值与其他容器类类似:它们将对象作为元素,而不是标量类型。因此,您需要用一个
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
是一回事。