在用户更改之前无法从设置包中读取默认值
Cannot Read Default Values from Settings Bundle Until Changed by User
在我的 iPhone 应用程序中,我使用设置包来存储我的应用程序设置以及预定义的默认值。例如,包括一个切换开关,默认设置为 true
:
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>Show score</string>
<key>Key</key>
<string>preference_show_score</string>
<key>DefaultValue</key>
<true/>
</dict>
当我使用
检索此值时
let showScore = UserDefaults.standard.bool(forKey: "preference_show_score")
观察到两个结果:
- 如果用户之前更改过设置,则将正确的设置分配给
showScore
。
- 如果用户没有触及该设置,检索到的值为
false
,即使默认值应为 true
。
因此,实际设置只有在用户更改后才能读取,这使得默认值变得多余。
关于这个主题的SO帖子很多,但是看完之后,我更加困惑了。
有些人建议在应用程序本身复制设置,但在这种情况下设置应用程序提供什么价值?而且,显然,检索设置并非完全不可能 - 只是在用户更改设置之前就无法检索。
其他一些答案说问题与在使用它们之前未使用 UserDefaults
注册默认值有关。在这里,我不确定应该如何以及在哪里完成。我已经在 AppDelegate
和读取值本身的方法中使用以下语句进行了尝试。事实上,根本不使用它似乎并没有什么不同。
UserDefaults.standard.register(defaults: [String:AnyObject]())
所以,根据我发现的所有信息,我想知道是否可以使用默认值,如果可以,如何正确完成?
而且,假设我也被迫在我的应用程序中存储默认设置,应用程序如何知道何时使用它们,即如果用户更新了设置?
注册默认值是完全正确的方法。尽快执行
let defaultValues = ["preference_show_score": true]
UserDefaults.standard.register(defaults: defaultValues)
该代码必须在应用启动时执行。默认值一直被考虑,直到用户更改它。
在我的 iPhone 应用程序中,我使用设置包来存储我的应用程序设置以及预定义的默认值。例如,包括一个切换开关,默认设置为 true
:
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>Show score</string>
<key>Key</key>
<string>preference_show_score</string>
<key>DefaultValue</key>
<true/>
</dict>
当我使用
检索此值时let showScore = UserDefaults.standard.bool(forKey: "preference_show_score")
观察到两个结果:
- 如果用户之前更改过设置,则将正确的设置分配给
showScore
。 - 如果用户没有触及该设置,检索到的值为
false
,即使默认值应为true
。
因此,实际设置只有在用户更改后才能读取,这使得默认值变得多余。
关于这个主题的SO帖子很多,但是看完之后,我更加困惑了。
有些人建议在应用程序本身复制设置,但在这种情况下设置应用程序提供什么价值?而且,显然,检索设置并非完全不可能 - 只是在用户更改设置之前就无法检索。
其他一些答案说问题与在使用它们之前未使用 UserDefaults
注册默认值有关。在这里,我不确定应该如何以及在哪里完成。我已经在 AppDelegate
和读取值本身的方法中使用以下语句进行了尝试。事实上,根本不使用它似乎并没有什么不同。
UserDefaults.standard.register(defaults: [String:AnyObject]())
所以,根据我发现的所有信息,我想知道是否可以使用默认值,如果可以,如何正确完成?
而且,假设我也被迫在我的应用程序中存储默认设置,应用程序如何知道何时使用它们,即如果用户更新了设置?
注册默认值是完全正确的方法。尽快执行
let defaultValues = ["preference_show_score": true]
UserDefaults.standard.register(defaults: defaultValues)
该代码必须在应用启动时执行。默认值一直被考虑,直到用户更改它。