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

时间:2019-05-03 14:08:47

标签: ios swift ios-settings-bundle

在我的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]())

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

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

1 个答案:

答案 0 :(得分:1)

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

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

无论何时启动应用程序,都必须执行代码。在用户更改默认值之前,将一直考虑该默认值。