Подтвердить что ты не робот

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

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

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

Я создал две функции в моем контроллере view, которые обрабатывают это. Здесь код:

    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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

В 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"
}