【问题标题】:Multivalue type settings bundle fields alway return null多值类型设置捆绑字段总是返回 null
【发布时间】:2011-06-14 15:01:20
【问题描述】:

我在首次启动应用程序时从设置包中检索默认值时遇到问题。所有非多值字段都正确返回默认值。所有多值字段都返回 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”会作为当前值返回,因为它设置为默认值。多值字段是否需要一些不同的处理?正如我之前所说,在此之前有 6 个字段可以正确返回它们的值。此字段和以下 2 个多值字段没有。多值字段的定义都是一样的。

【问题讨论】:

  • 我可能会误解这一点,但看起来“upthreshold”是键“Key”的值,而不是键本身。
  • 我以这种方式设置了所有字段,并且我看到的每个示例都以这种方式设置“键”,这就是您在调用 objectForKey 时引用字段的方式。我认为这是对的。如果不是,你会如何定义它?
  • 如果尚未访问设置页面,我总是在使用默认值时遇到问题。我倾向于检测 nil 并将默认值硬编码到应用程序中。它不漂亮,但它有效:(

标签: iphone web-applications settings.bundle


【解决方案1】:

如果用户没有在设置应用中更改该值,则没有设置。 在设置包中指定的默认值只是在设置应用程序中显示的默认值

您必须手动注册您的默认值。 NSUserdefaults 不使用设置包中的默认值。
使用类似的东西,将其添加到应用程序的开头(在访问用户默认值之前)。
注册的用户默认值不会保存到磁盘或任何东西。每次启动应用程序时都必须注册它们。

NSDictionary *userDefaultsDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
                                      @"15", @"upthreshold",
                                      nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsDefaults];

【讨论】:

  • 谢谢。那成功了。在更改之前默认值适用于单值字段似乎很奇怪(我从未使用设置应用程序设置它们)。如果不必每次在应用程序中都设置一个默认值,而不是真正的默认值,这似乎是违反直觉的。有点脱离了减少编程时间的功能。无论如何,感谢您的帮助。
  • 这个错误功能与值类型无关——我在使用布尔值时遇到了同样的问题(指定的默认值为 YES,但 [defaults boolForKey:...] 返回 NO)。
  • 我刚遇到这个问题。如果您只为一个键执行registerDefaults,那么简单地为给定键设置对象有什么不同?
【解决方案2】:

我刚遇到这个问题,我问自己为什么设置包提供了一个默认值,如果这个值永远无法从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
        }
    }
}

【讨论】:

    猜你喜欢
    • 2016-07-15
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 2013-10-27
    • 2018-07-24
    • 2023-04-06
    • 2012-05-07
    • 1970-01-01
    相关资源
    最近更新 更多