iOS 8.2 [NSUserDefaults standardUserDefaults] 返回 nil
iOS 8.2 [NSUserDefaults standardUserDefaults] returning nil
我在 iOS 8.2 中遇到一个奇怪的问题,其中 [NSUserDefaults standardUserDefaults] 在 iPhone 上返回 nil。同样的逻辑在 iOS 的所有先前版本中都适用。我有一个通用应用程序,它有两个不同的 settings.plist,一个用于 iPad,另一个用于 iPhone,列表如下;
Settings.bundle-
-Root.plist
-Root~iphone.plist
在设备上安装后,会显示正确的设置窗格,用户可以为给定的字段输入适当的值。虽然在我的应用程序中运行时 [NSUserDefaults standardUserDefalts] returns 一个 nil 对象。
我可能做错了什么? Apple 是否更改了 8.2 中的预期内容?
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
无论在系统设置中设置什么首选项,userDefaults 始终为 nil。
您是否将词典设置为 "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]
不再为nil。
在我的例子中,[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"];
}
我在 iOS 8.2 中遇到一个奇怪的问题,其中 [NSUserDefaults standardUserDefaults] 在 iPhone 上返回 nil。同样的逻辑在 iOS 的所有先前版本中都适用。我有一个通用应用程序,它有两个不同的 settings.plist,一个用于 iPad,另一个用于 iPhone,列表如下;
Settings.bundle-
-Root.plist
-Root~iphone.plist
在设备上安装后,会显示正确的设置窗格,用户可以为给定的字段输入适当的值。虽然在我的应用程序中运行时 [NSUserDefaults standardUserDefalts] returns 一个 nil 对象。
我可能做错了什么? Apple 是否更改了 8.2 中的预期内容?
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
无论在系统设置中设置什么首选项,userDefaults 始终为 nil。
您是否将词典设置为 "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]
不再为nil。
在我的例子中,[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"];
}