Поля пакета настроек многозначного типа всегда возвращают значение null

У меня проблема с получением значений по умолчанию из пакета настроек при первом запуске приложения. Все немногозначные поля возвращают значение по умолчанию правильно. Все многозначные поля возвращают 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 полей, которые правильно возвращают свои значения. Это поле и следующие два многозначных поля - нет. Все многозначные поля определены одинаково.


person mlewis54    schedule 24.01.2011    source источник
comment
Я мог бы неправильно это понять, но похоже, что upthreshold - это значение для ключа Key, а не сам ключ.   -  person Brian Donovan    schedule 24.01.2011
comment
У меня все поля настроены таким образом, и каждый пример, который я видел, устанавливает ключ таким образом, и именно так вы ссылаетесь на поле, когда выполняете вызов objectForKey. Думаю, это правильно. Если нет, как бы вы это определили?   -  person mlewis54    schedule 24.01.2011
comment
У меня всегда были проблемы со значениями по умолчанию, если страница настроек еще не была посещена. Я обычно обнаруживаю nil и жестко запрограммировал значение по умолчанию в приложении. Это некрасиво, но работает :(   -  person deanWombourne    schedule 24.01.2011


Ответы (2)


Если значение не было изменено пользователем в приложении настроек, настройка отсутствует. Значение по умолчанию, указанное в наборе настроек, используется только по умолчанию для отображения в приложении настроек.

вам необходимо вручную зарегистрировать значения по умолчанию. NSUserdefaults не использует значения по умолчанию из пакета настроек.
Используйте что-то вроде этого, добавьте его в начало вашего приложения (до того, как вы получите доступ к userdefaults).
Зарегистрированные Userdefaults не сохраняются на диск или что-либо еще. Вы должны регистрировать их каждый раз при запуске приложения.

NSDictionary *userDefaultsDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
                                      @"15", @"upthreshold",
                                      nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsDefaults];
person Matthias Bauch    schedule 24.01.2011
comment
Спасибо. Это помогло. Кажется странным, что значения по умолчанию работали для полей с одним значением до изменения (я никогда не устанавливал их с помощью приложения настроек). Кажется нелогичным иметь значение по умолчанию, которое на самом деле не так, без необходимости устанавливать его каждый раз в приложении. Вид отнимает функцию, которая сокращает время программирования. Тем не менее, спасибо за помощь. - person mlewis54; 24.01.2011
comment
Эта ошибка не связана с типом значения - у меня такая же проблема с логическими значениями (по умолчанию задано ДА, но [по умолчанию boolForKey: ...] возвращает НЕТ). - person 18446744073709551615; 23.11.2011
comment
Я просто столкнулся с этой проблемой. Если вы делаете registerDefaults только для одного ключа, чем отличается простое задание объекта для данного ключа? - person Besi; 29.05.2015

Я только что столкнулся с этой проблемой и спрашиваю себя, почему пакет настроек предоставляет значение по умолчанию, если это значение никогда не может быть прочитано из 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
        }
    }
}
person Besi    schedule 29.05.2015