iOS 8.2 [NSUserDefaults standardUserDefaults]返回nil

时间:2015-03-19 21:33:52

标签: ios iphone ipad nsuserdefaults ios8.2

我在iOS 8.2中遇到一个奇怪的问题,其中[NSUserDefaults standardUserDefaults]在iPhone上返回nil。同样的逻辑未经修改已经适用于所有以前版本的iOS。我有一个通用应用程序,有两个不同的settings.plist一个用于iPad,另一个用于iPhone列表如下;

Settings.bundle-
    -Root.plist
    -Root~iphone.plist

安装在设备上时,会显示正确的设置窗格,用户可以输入给定字段的相应值。虽然在运行时我的应用程序[NSUserDefaults standardUserDefalts]返回一个nil对象。

我可能做错了什么? Apple改变了预期的8.2吗?

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
无论在系统设置中设置了什么首选项,

userDefaults始终为nil。

1 个答案:

答案 0 :(得分:3)

您是否将字典设置为"Settings.bundle/Root.plist"

// Register the preference defaults from file "Settings.bundle/Root.plist"
NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:
                            [[NSBundle mainBundle] pathForResource:@"Settings.bundle/Root"
                                                            ofType:@"plist"]];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];

此后[NSUserDefaults standardUserDefaults]不再是零。

就我而言,[NSUserDefaults standardUserDefaults]使用的字典在调试器中如下所示:

    {
        PreferenceSpecifiers =     (
                    {
                DefaultValue = 1;
                Key = sortByDistance;
                Title = "Sortiere nach Entfernung";
                Type = PSToggleSwitchSpecifier;
            }
        );
        StringsTable = Root;
    }

要访问偏好,我写了一个很小的方法:

- (id) preferenceValueForKey: (NSString *)key {
    NSArray *preferences = [[NSUserDefaults standardUserDefaults] arrayForKey:@"PreferenceSpecifiers"];
    NSUInteger index = [preferences indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
        return [[obj valueForKey:@"Key"] isEqualToString:key];
    }];
    return [preferences[index] valueForKey:@"DefaultValue"];
}