首次启动应用时,我在设置包中检索默认值时遇到问题。所有非多值字段都会正确返回默认值。所有多值字段都返回NULL。我用来检索当前值的代码:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *upt=[defaults objectForKey:@"upthreshold"];
Root.plist的相关部分是:
<dict>
<key>Title</key>
<string>Update Threshold</string>
<key>Type</key>
<string>PSMultiValueSpecifier</string>
<key>Key</key>
<string>upthreshold</string>
<key>DefaultValue</key>
<string>15</string>
<key>Titles</key>
<array>
<string>2 km</string>
<string>5 km</string>
<string>10 km</string>
<string>15 km</string>
<string>25 km</string>
<string>50 km</string>
<string>75 km</string>
<string>100 km</string>
<string>150 km</string>
<string>250 km</string>
<string>500 km</string>
<string>1000 km</string>
</array>
<key>Values</key>
<array>
<string>2</string>
<string>5</string>
<string>10</string>
<string>15</string>
<string>25</string>
<string>50</string>
<string>75</string>
<string>100</string>
<string>150</string>
<string>250</string>
<string>500</string>
<string>1000</string>
</array>
</dict>
我希望“15”将作为当前值返回,因为它设置为默认值。 Multivalue字段是否需要一些不同的处理?正如我之前所说,在此之前有6个字段正确返回它们的值。此字段和以下2个多值字段不会。多值字段都定义相同。
答案 0 :(得分:21)
如果用户未在设置应用中更改该值,则表示没有设置。 设置包中指定的默认值仅为设置应用
中显示的默认值您必须手动注册默认值。 NSUserdefaults不使用设置包中的默认值 使用类似的东西,在应用程序的开头添加它(在访问用户默认值之前) 注册的用户默认不会保存到磁盘或任何其他内容。每次启动应用程序时都必须注册它们。
NSDictionary *userDefaultsDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
@"15", @"upthreshold",
nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsDefaults];
答案 1 :(得分:1)
我刚遇到这个问题而且我问自己为什么设置包提供了一个默认值,如果永远无法从NSUserDefaults
读取该值。
我创建了一个快速扩展,执行以下操作:
所以我可以这样做:
NSUserDefaults.standardUserDefaults().settignsStringValue("MYPREFS_DOMAIN", defaultValue: "domain.com")
这是扩展名:
extension NSUserDefaults{
func settingsBoolValue(key: String, defaultValue: Bool) -> Bool{
// The case for Bool is different as it would return `false` when the key is not set.
if let v: AnyObject = self.objectForKey(key){
// The boolean value exists
} else {
self.setObject(defaultValue, forKey: key)
}
return self.boolForKey(key)
}
func settingsStringValue(key: String, defaultValue: String) -> String{
if let v = self.stringForKey(key){
return v
} else {
self.setObject(defaultValue, forKey: key)
return defaultValue
}
}
}