web-dev-qa-db-fra.com

Comment récupérer et affecter un objet NSDate à partir de NSUserDefaults?

Je crée une application chronomètre et j'ai besoin de stocker la date de début avant que l'utilisateur ne ferme l'application et que je ne la récupère lorsque l'utilisateur ouvre à nouveau l'application.

Ainsi, par exemple, si l'utilisateur démarre le chronomètre, puis ferme l'application puis, après un certain temps, ouvre à nouveau l'application, l'application doit ajouter le temps entre l'ouverture et la fermeture au temps de fonctionnement si le chronomètre était en cours d'exécution.

J'ai créé deux fonctions dans mon viewcontroller qui gèrent cela. Voici le code:

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

J'ai parcouru quelques articles ici sur StackOverflow:

Quelle est la meilleure façon de stocker une NSDate dans NSUserDefaults?

iOS - Impossible de stocker NSDate dans NSUserDefaults

37
Atharva Vaidya

Définissez votre objet date comme suit:

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

Récupérez-le en utilisant:

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

Swift 3/4/5 en utilisant Date (type alias) au lieu de NSDate:

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

N'oubliez pas d'utiliser l'opérateur de conversion conditionnelle as? à éviter le plantage s'il n'y a pas encore de date sous "yourKey" dans UserDefaults.

29
KlimczakM