【问题标题】:Store ON/OFF switch in NSUserDefaults?在 NSUserDefaults 中存储 ON/OFF 开关?
【发布时间】:2012-09-03 17:12:52
【问题描述】:

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

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

【问题讨论】:

标签: ios cocoa-touch nsuserdefaults uiswitch


【解决方案1】:

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

存储它:

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

取回它:

[[NSUserDefaults standardUserDefaults] objectForKey:@"the_key"]

【讨论】:

  • 别忘了调用 [[NSUserDefaults standardUserDefaults] synchronize];
  • ^ 不错。我完全忘记了。
【解决方案2】:

将它包装在一个 NSNumber numberWithBool:.

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

// and get it out
BOOL savedSwitch = [[defaults valueForKey:@"mySwitchValue"] boolValue];

【讨论】:

    【解决方案3】:

    您需要将两个布尔键保存在 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];
    }
    

    将 View 上的 UISwitch 从 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"];
          }
    
     }
    

    【讨论】:

      【解决方案4】:

      在我的一个应用程序中,我检查是否使用了 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,这一直是一个解决方案。寻找有关此解决方案的 cmets。

      【讨论】:

        【解决方案5】:

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

        - (void) toggleUserPreference:(BOOL) preferOn {
            NSString *newPreference = preferOn ? @"on" : @"off";
            [[NSUserDefaults standardUserDefaults] setValue:newPreference
                                                     forKey:ONOFF_PREFERENCE_KEY];
            [[NSUserDefaults standardUserDefaults] synchronize];
        }
        

        【讨论】:

        • 或者直接用- setBool:forKey:存储,- boolForKey:得到结果。
        • 最直接的方法是使用boolForKey:
        猜你喜欢
        • 1970-01-01
        • 2016-11-08
        • 1970-01-01
        • 2014-10-14
        • 2017-02-08
        • 1970-01-01
        • 2012-10-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多