Как получить и назначить объект NSDate из NSUserDefaults?

Я создаю приложение для секундомера, и мне нужно сохранить дату начала до того, как пользователь закроет приложение, и мне нужно получить ее, когда пользователь снова откроет приложение.

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

Я создал две функции в своем контроллере просмотра, которые справляются с этим. Вот код:

    override func viewWillAppear(animated: Bool)
    {

      let startTimedefault:NSUserDefaults = NSUserDefaults.standardUserDefaults()

      let startTimesaved:NSDate = startTimedefault.objectForKey("start time") // This line is buggy


      if(launchBool == true)
      {      
         timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "fireStopWatch", userInfo: nil, repeats: true)

         startTime = startTimesaved
      }

      if(launchBool == false)
      {
         timer.invalidate()
      }

    }

    override func viewWillDisappear(animated: Bool)
    {
       NSUserDefaults.standardUserDefaults().setObject(launchBool, forKey: "Start/Stop")
       NSUserDefaults.standardUserDefaults().setObject(startTime, forKey: "start time")
       NSUserDefaults.standardUserDefaults().setObject(elapsedTime, forKey: "elapsed time")
    }

Я прочитал пару сообщений здесь, в StackOverflow:

Каков оптимальный способ хранения NSDate в NSUserDefaults? < / а>

iOS - невозможно сохранить NSDate в NSUserDefaults


person Atharva Vaidya    schedule 04.11.2014    source источник


Ответы (3)


Установите объект даты следующим образом:

UserDefaults.standard.set(Date(), forKey:"yourKey")

Получите его, используя:

UserDefaults.standard.object(forKey: "yourKey") as? Date

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

person Sujith Thankachan    schedule 04.11.2014
comment
Или как из Swift 1.2 NSUserDefaults.standardUserDefaults().objectForKey("yourKey") as! NSDate - person Viesturs Knopkens; 10.06.2015
comment
Это приведет к сбою, если yourKey еще не сохранен в userDefaults. Вместо этого следует использовать as? NSDate - person Inn0vative1; 28.02.2017
comment
@ Inn0vative1 конечно, никогда не разворачивайте опционально принудительно, если вы не уверены, что есть значение - person Dannie P; 26.07.2017
comment
@ Inn0vative1 Итак, наткнулся на эту страницу, и спустя 2 1/2 + года после вашего комментария (и через 5 лет после его ответа!) Я отредактировал это, чтобы указать, что вы должны получить необязательный. UserDefaults всегда будет равен нулю при первой проверке (если только у вас нет другой настойчивости, чтобы знать, что он установлен, что не имеет смысла). Не могу поверить, что ответ, который был так долго, гарантировал крах. - person Mike Sand; 20.10.2019

Версия Swift 3/4/5 с использованием Date (псевдоним типа) вместо NSDate:

let yourDate = UserDefaults.standard.object(forKey: "yourKey") as? Date
UserDefaults.standard.set(yourDate, forKey: "yourKey")

Не забудьте использовать оператор условного приведения as?, чтобы избежать сбоя, если в поле "yourKey" в UserDefaults еще нет даты.

person KlimczakM    schedule 21.03.2017

В Swift 5

Вы можете сделать простую инкапсуляцию для лучшего управления кодом

struct UserSetting {

    static var shared = UserSetting()

    var practiceTime: Date?{
        get {
            return UserDefaults.standard.object(forKey: TimeScaler.start) as? Date
        }
        set(newVal){
            UserDefaults.standard.set(newVal, forKey: TimeScaler.start)
        }
    }

}



struct TimeScaler {

    static let start = "start"
}
person dengST30    schedule 21.10.2019