在用户更改之前无法从设置包中读取默认值

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")

观察到两个结果:

  1. 如果用户之前更改过设置,则将正确的设置分配给showScore
  2. 如果用户没有触及该设置,检索到的值为 false,即使默认值应为 true

因此,实际设置只有在用户更改后才能读取,这使得默认值变得多余。

关于这个主题的SO帖子很多,但是看完之后,我更加困惑了。

有些人建议在应用程序本身复制设置,但在这种情况下设置应用程序提供什么价值?而且,显然,检索设置并非完全不可能 - 只是在用户更改设置之前就无法检索。

其他一些答案说问题与在使用它们之前未使用 UserDefaults 注册默认值有关。在这里,我不确定应该如何以及在哪里完成。我已经在 AppDelegate 和读取值本身的方法中使用以下语句进行了尝试。事实上,根本不使用它似乎并没有什么不同。

UserDefaults.standard.register(defaults: [String:AnyObject]())

所以,根据我发现的所有信息,我想知道是否可以使用默认值,如果可以,如何正确完成?

而且,假设我也被迫在我的应用程序中存储默认设置,应用程序如何知道何时使用它们,即如果用户更新了设置?

注册默认值是完全正确的方法。尽快执行

let defaultValues = ["preference_show_score": true]
UserDefaults.standard.register(defaults: defaultValues)

该代码必须在应用启动时执行。默认值一直被考虑,直到用户更改它。