如何从NSUserDefaults检索和分配NSDate对象



我正在构建一个秒表应用程序,我需要在用户关闭应用程序之前存储开始日期,并需要在用户再次打开应用程序时检索它。

因此,例如,如果用户启动秒表,然后关闭应用程序,然后在一段时间后再次打开应用程序,如果秒表正在运行,则应用程序应将打开和关闭之间的时间添加到运行时间中。

我在视图控制器中创建了两个函数来处理此问题。这是代码:

    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

按如下方式设置日期对象:

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

检索使用:

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

当然,日期将是可选的,因为它可能永远不会被设置。

Swift 3/4/5版本使用Date(类型别名)而不是NSDate:

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

如果UserDefaults中的"yourKey"下还没有日期,请记住使用条件转换运算符as?避免崩溃

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

最新更新