Трудности с регистрацией значений по умолчанию для приложения iOS

Я работал над набором настроек для своего приложения для iOS и добавил несколько тумблеров для установки единиц измерения. По какой-то причине способ, которым я регистрировал значения по умолчанию при запуске, не работает. В методе didFinishLaunching моего appDelegate я добавил:

let defaultDict  = ["altitudeMeters" : 3.28084]

NSUserDefaults.standardUserDefaults().registerDefaults(defaultDict)

NSUserDefaults.standardUserDefaults().synchronize()

Когда я запускаю приложение и получаю значение тумблера с идентификатором «altitudeMeters», оно возвращает «0,0». Если я изменю положение переключателя, он вернет значения, введенные в моем наборе настроек. Я что-то упустил при регистрации значения по умолчанию для этого переключателя?

Переключатель устроен следующим образом:

введите здесь описание изображения

Я пытался получить доступ к значению, используя:

let altitudeFactor = NSUserDefaults.standardUserDefaults().doubleForKey("altitudeMeters")

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


person user3185748    schedule 11.01.2015    source источник


Ответы (1)


Когда вы сохраняете свой словарь, он сохраняет его как [NSObject : AnyObject]?, поэтому вам нужно будет сделать это следующим образом:

пусть myDefaultDict = ["altitudeMeters": 3.28084]

func saveMyDictionary(){
   NSUserDefaults.standardUserDefaults().setObject(myDefaultDict, forKey: "myDefaultDict")
}
func loadAltitude() -> Double? {
    if let loadedDictionary = NSUserDefaults.standardUserDefaults().dictionaryForKey("myDefaultDict") {
        if let altitudeStored = loadedDictionary["altitudeMeters"] as? Double {
            return altitudeStored
        }
    }
    return nil
}

saveMyDictionary()

let altitudeFactor = loadAltitude() // it will return an optional

println(altitudeFactor!)  // you can force unwrap it if you are sure it wont be nil

// otherwise you can you if let
if let altitudeFactor = altitudeFactor {
    println(altitudeFactor) // inside the brackets it is not an optional
}

если вам нужно удалить/сбросить его значение:

NSUserDefaults.standardUserDefaults().removeObjectForKey("myDefaultDict")

вы также можете сохранить его как Double вместо Dictionary следующим образом:

func saveAltitudeMeters(high:Double){
    NSUserDefaults.standardUserDefaults().setDouble(high, forKey: "altitudeMeters")
}
func loadAltitudeMeters() -> Double? {
    return NSUserDefaults.standardUserDefaults().doubleForKey("altitudeMeters")
}

saveAltitudeMeters(3.7)

if let loadedAltitudeMeters = loadAltitudeMeters() {
    println(loadedAltitudeMeters)   // 3.7
}
person Leo Dabus    schedule 11.01.2015
comment
Я пытался добавить то, что вы предложили, но после запуска приложения, если я вызываю значение этого параметра с помощью let altitudeFactor = NSUserDefaults.standardUserDefaults().doubleForKey("altitudeMeters"), я все равно получаю 0.0 - person user3185748; 11.01.2015
comment
Вы не делаете то, что я сказал вам делать - person Leo Dabus; 11.01.2015
comment
Насколько я понимаю, предоставленный вами код по-прежнему является кодом для AppDelegate, который инициализирует значения по умолчанию. Итак, как мне получить доступ к значению моего переключателя в моем контроллере представления после их установки таким образом? - person user3185748; 11.01.2015
comment
Как вы думаете, вы могли бы тогда указать мне правильное направление, чтобы получить доступ к моим настройкам? Я немного запутался. - person user3185748; 11.01.2015
comment
Мне жаль задавать еще один глупый вопрос, но прямо сейчас у меня есть ваши функции, настроенные в моем AppDelegate, и мне в конечном итоге нужно получить доступ к этому значению в моем собственном контроллере представления. Я не думаю, что смогу создать экземпляр AppDelegate для вызова метода loadAltitude(). Я что-то неправильно понимаю? - person user3185748; 11.01.2015
comment
Поэтому я бы поместил его в какой-то произвольный класс, вызвал метод saveMyDictionary в моем viewDidLoad моего контроллера представления, а затем, если я вызову метод loadAltitude, который даст мне значение моего переключателя? - person user3185748; 11.01.2015
comment
Что ж, после того, как я попробовал эти самые последние функции прямо в моем контроллере представления (они имели для меня наибольший смысл), я понял! Большое спасибо за то, что нашли время, чтобы поработать со мной :) Хороших выходных! - person user3185748; 11.01.2015