2

我有一个应用程序,我使用 NSUserDefaults 来确定它是否是第一次有人打开该应用程序。如果是第一次,应用程序会显示一个教程页面。

现在,我想对此进行更改,以便如果用户将 ON/OFF 开关移动到“ON”,他们在启动应用程序时将看不到教程。如何在 NSUserDefaults 中存储用户对 ON/OFF 开关的选择?

4

5 回答 5

7

我用下面的代码做了这样的事情:

存储它:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setBool:YES forKey:@"the_key"];
[[NSUserDefaults standardUserDefaults] synchronize]; //Thanks Henri Normak

检索它:

[[NSUserDefaults standardUserDefaults] objectForKey:@"the_key"]
于 2012-09-03T17:20:19.053 回答
3

将其包裹在 NSNumber numberWithBool: 中。

[defaults setValue:[NSNumber numberWithBool:mySwitch.on] forKey:@"mySwitchValue"];

// and get it out
BOOL savedSwitch = [[defaults valueForKey:@"mySwitchValue"] boolValue];
于 2012-09-03T17:15:40.593 回答
1

您需要将两个 bool 键保存在 NSUserDefaults 中才能获得您想要的。例如firstTime用于检查应用程序首次启动,showTutorial用于检查/保存开关更改

您可以使用以下方法设置布尔值:

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"firstTime"];

并使用以下代码阅读:

if([[NSUserDefaults standardUserDefaults] boolForKey:@"showTutorial"] || [[NSUserDefaults standardUserDefaults] boolForKey:@"firstTime"]) {
    [self displayTutorial];
    [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"firstTime"];
} 
else {
    [self displayMainScreen];
}

将 UISwitch on View 从 InterfaceBuilder 链接到 valuechanged 上的此操作

-(IBAction)userSetOnOff:(id)sender
 {
      UISwitch *switchValue = sender;
      if (switchValue.on){
           [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"showTutorial"];
      }
      else{
           [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"showTutorial"];
      }

 }
于 2012-09-03T17:41:30.823 回答
1

在我的一个应用程序中,我检查是否使用了 NSUserDefaults,如果没有设置一个标准的用户默认变量。

-(id)初始化

{

standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSString *testInitState = [standardUserDefaults stringForKey:kInstallInit];
if (testInitState == nil)
{

    #if(kStateModelDebug)
    NSLog(@" State Model: First time initialized");
    #endif
    [self.standardUserDefaults setObject:@"true"  forKey:kInstallInit];
    [self.standardUserDefaults synchronize];

    // Start the tutorials, init DB, etc


}
else 
{
    #if(kStateModelDebug)
    NSLog(@" State Model has ALREADY been initialized");
    #endif

    // Read other state variables and/or init the startup processes

}
return self;    

}

到目前为止,直到 ios 5.0 和新的 6.0,这一直是一个解决方案。寻找对此解决方案的评论。

于 2013-02-19T21:47:44.230 回答
-1

一种方法是简单地保留一个带有开关状态的字符串。如果用户更喜欢 on 位置,您将存储 string @"on"。否则存储字符串@"off"

- (void) toggleUserPreference:(BOOL) preferOn {
    NSString *newPreference = preferOn ? @"on" : @"off";
    [[NSUserDefaults standardUserDefaults] setValue:newPreference
                                             forKey:ONOFF_PREFERENCE_KEY];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
于 2012-09-03T17:16:44.883 回答