【问题标题】:Get ios multi-value user preferences获取ios多值用户偏好
【发布时间】:2012-09-06 16:17:36
【问题描述】:

我尝试使用“设置包”检索在设置应用程序中选择的值。该字段是“PSMultiValueSpecifier”。在“Root.plist”中我实现了:

  • 类型:PSMultiValueSpecifier
  • 标题:Abcdefg
  • 密钥:abcdefg
  • 默认值:aaa
  • 值(数组):

     Item 0: aaa
     Item 1: bbb 
    
  • 标题(数组):

    Item 0: A
    Item 1: B
    

而且,在我写的实现文件中:

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *string = [defaults objectForKey:@"abcdefg"];

但是“字符串”是空的。当我对用户默认类型执行相同操作时:“PSTextFieldSpecifier”我可以检索该值。

我按照“Apress - 开始 iOS 5 开发:探索 iOS SDK”一书中的说明进行操作,但无法检索所选值。

说明同“苹果开发帮助”。

我不明白是什么问题。这似乎很容易。

【问题讨论】:

    标签: settings.bundle


    【解决方案1】:

    我已经找到了错误。

    如果您在“Settings.bundle”中实现“多值”用户首选项(使用其“默认值”),但从不进入设置 iPhone 模拟器并且从不更改多值首选项,则句子:

        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        NSString *string = [defaults objectForKey:@"key"];
    

    返回一个“nil”值。难以置信,我花了一周的时间试图找到问题!!!!

    但我有一个疑问:

    如果我实现了“多值”用户首选项并在 iTunes Store 中发布了应用程序,但用户不使用此“多值”用户首选项,“NSUserDefaults”将返回零值?

    我是否必须考虑收到空值的可能性?

    真的,我觉得这很荒谬。

    【讨论】:

    • 你找到解决办法了吗?
    • 只处理空值。一个例子(源代码): if (([multiValue length] == 0) || ([multiValue isEqualToString:@"value1"])) {}
    【解决方案2】:

    DefaultValue 似乎只在官方设置应用中使用。显然,您必须通过以下方式注册默认值:1)测试您的一项设置以查看它是否为 NULL,然后 2)遍历设置,获取并设置默认值:

    sample Obj-C code for this by just.do.it

    documentation on PSMultiValueSpecifier 在这里似乎有缺陷。对此的困惑出现在 SO 和网络上。例如:

    【讨论】:

      【解决方案3】:

      不,我认为您需要注册您的默认值,例如:

       -(BOOL) application: (UIApplication*) application didFinishLaunchingWithOptions: (NSDictionary*) launchOptions
      {
      
           NSDictionary* defaults = @{@"key": @"default value"};
           [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
      }
      

      这是因为该应用对其包含的设置包一无所知。本书Beginning iOS6 Development: Exploring the iOS SDK的第430页对此有明确的解释。

      【讨论】:

        【解决方案4】:

        如果返回的对象为 nil,则设置默认值。

        NSString * key = @"the key";
        NSUserDefaults * uD = [NSUserDefaults standardUserDefaults];
        NSString * stringValue = [uD objectForKey:key];
        
        if (!stringValue) {
            stringValue = @"the default value";
            [uD registerDefaults:@{key: stringValue}];
        }
        

        【讨论】:

          猜你喜欢
          • 2023-03-22
          • 2013-05-25
          • 2017-08-25
          • 1970-01-01
          • 2014-05-17
          • 2011-10-17
          • 2011-11-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多