【问题标题】:Settings Bundle values not being linked correctly on iPhone设置捆绑值未在 iPhone 上正确链接
【发布时间】:2011-12-11 03:56:49
【问题描述】:

我最近几天一直在努力解决一个问题。我有一个设置包 root.plist,其中包含一些用户首选项。其中包含三个多值菜单项。一个返回布尔值,另外两个返回数字。

当我调用[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] 并在控制台中检查它时,只有属性列表中的第一项显示它的值。其他两个明显缺席。结果,当我尝试检索这些值时,我得到了零。

更奇怪的是,设置包在 iPhone 上的“设置”应用中看起来是正确的。唯一不起作用的是值没有被传递。就我的应用而言,其他两个多值菜单项甚至都不存在。

非常感谢任何建议。

【问题讨论】:

    标签: iphone ios plist settings.bundle


    【解决方案1】:

    我在applicationDidFinishLaunchingWithOptions 中多次使用此代码块来初始化我的用户默认值。

        if (![[NSUserDefaults standardUserDefaults] objectForKey:@"somePropertyYouExpect"])  {
    
        NSString  *mainBundlePath = [[NSBundle mainBundle] bundlePath];
        NSString  *settingsPropertyListPath = [mainBundlePath
                                               stringByAppendingPathComponent:@"Settings.bundle/Root.plist"];
    
        NSDictionary *settingsPropertyList = [NSDictionary 
                                              dictionaryWithContentsOfFile:settingsPropertyListPath];
    
        NSMutableArray      *preferenceArray = [settingsPropertyList objectForKey:@"PreferenceSpecifiers"];
        NSMutableDictionary *registerableDictionary = [NSMutableDictionary dictionary];
    
        for (int i = 0; i < [preferenceArray count]; i++)  { 
            NSString  *key = [[preferenceArray objectAtIndex:i] objectForKey:@"Key"];
    
            if (key)  {
                id  value = [[preferenceArray objectAtIndex:i] objectForKey:@"DefaultValue"];
                [registerableDictionary setObject:value forKey:key];
            }
        }
    
        [[NSUserDefaults standardUserDefaults] registerDefaults:registerableDictionary]; 
        [[NSUserDefaults standardUserDefaults] synchronize]; 
    } 
    

    【讨论】:

    • 这太棒了。非常感谢,我真的很感激。我想我忘了我必须告诉我的应用程序从设置包中获取信息!我把这个项目搁置了很长时间,然后才重新拿起它。
    • 注册默认值的更好位置是在 AppDelegate 的 + (void) 初始化方法中。这样它只会被调用一次,并且您不需要执行 if 语句。
    【解决方案2】:

    确保您在NSUserDefaults 上使用- (void)registerDefaults:(NSDictionary *)dictionary。否则,您的默认值将不会从 Bundle 中提取。

    在您尝试检索任何默认值之前,您必须在应用程序的早期执行此操作。

    http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 2016-07-15
      • 1970-01-01
      • 2018-06-22
      相关资源
      最近更新 更多