2014-04-22 36 views
0

我有一个包含单个项目的设置包。该项目是一个设置为NO的开关。使用NSUserDefaults不起作用的应用程序设置

我正在使用它来允许用户注销我想要创建的应用程序。但是,当用户打开应用程序时,转到设置并选择切换到注销时,他们回到应用程序没有任何反应。如果他们回到设置再次切换,然后回去,然后如果报名进入corrently ...

这几乎就像设置不是第一次读,但我不知道如何解决这个问题...

这是我的代码是什么样子

- (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]; 
    } 
} 

任何帮助,将不胜感激。

回答

1

用户默认行为像其他容器类一样:它们将对象作为元素而不是标量类型。所以,你需要换行的标量型(BOOL)与NSNumber

[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

您也可以使用短格式@(NO),或者仅使用@NO。 – iamamused

+0

它很难解释,但我会尝试。目前,当我第一次访问NSUSerDefault时,这些值不是可用的。所以当我第一次注销它没有看到。我退出应用程序并再次回到它,然后我的代码工作。是的,我的代码与您的示例有关,但是现在交换机正在被正确重置,从不登出,因为当我第一次使用它时,它会切换回NO。我第二次登录没有任何反应。我不知道为什么会发生这种情况。 – HurkNburkS

+0

@HurkNburkS - 不太关注你,但要记住,在阅读和设置开关值(或者你正在做的任何事情)时你必须打开对象。请参阅我的编辑。 – danh

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说法是没有意义的,因为一旦用户更改交换机上,然后后,即使它是真的,那将是真正的他们再次关闭开关。

备注 - 为什么你要让用户切换到Settings应用程序才能注销?为什么不提供在应用程序中注销的功能?这将是一个更好的用户体验。

相关问题