Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multivalue type settings bundle fields alway return null

I have a problem retrieving default values from the settings bundle when first launching an App. All non-multivalue fields return the default correctly. All multivalue fields return NULL. The code I am using to retrieve the current value:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *upt=[defaults objectForKey:@"upthreshold"];

The relevant section from Root.plist is:

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

I would expect that "15" would come back as the current value as it is set to the default value. Is there some different processing required for Multivalue fields? As I said previously, there are 6 fields prior to this that return their values correctly. This field and the following 2 Multivalue fields do not. The multivalue fields are all defined the same.

like image 864
mlewis54 Avatar asked Jan 24 '11 16:01

mlewis54


2 Answers

If the value wasn't changed by the user in the settings app there is no setting. The default value specified in the settings bundle is only the default for display in the settings app

you have to manually register your default values. NSUserdefaults doesn't use the defaults from the settings bundle.
Use something like this, add it at the beginning of your app (before you access the userdefaults).
Registered Userdefaults are not saved to disk or anything. You have to register them every time you start the app.

NSDictionary *userDefaultsDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
                                      @"15", @"upthreshold",
                                      nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsDefaults];
like image 118
Matthias Bauch Avatar answered Nov 07 '22 11:11

Matthias Bauch


I just ran into this problem and I ask myself why the settings bundle provides a default value, if this value can never be read from the NSUserDefaults.

I created a swift extension that does the following:

  • Read the value for a given key
  • If the key does not exist set a default and return this default

So I can do this:

NSUserDefaults.standardUserDefaults().settignsStringValue("MYPREFS_DOMAIN", defaultValue: "domain.com")

This is the extension:

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
        }
    }
}
like image 22
Besi Avatar answered Nov 07 '22 11:11

Besi