在NSUserDefaults(Swift)

时间:2015-08-19 16:03:49

标签: swift nsdate nsuserdefaults nsdateformatter

您好我正在创建一个有两个控件:一个NSSlider和一个连续更新的NSTextField。我在NSTextField中添加了一个NSDateFormatter,以便它显示格式化为时间的滑块的当前值。滑块的范围为0到86,400单位(这样用户可以在24小时范围内滑动秒数)。

我将我的应用程序连接到共享用户默认控制器,以便为用户存储该值。

应用程序在NSTextField中显示正确的时间,但它始终以秒为单位存储值。例如,如果用户在移动滑块时选择了06:32:14,系统实际上会在键 startTime

中存储23534.2261709793

当用户再次打开应用时,他们会按预期看到06:32:14。

我的问题是当我想在我的代码中读取变量时:

我可以将值读为Double:

let value = NSUserDefaults.standardUserDefaults().objectForKey("startTimeValue") as? Double

这样可以正常工作,如果我尝试将其强制转换为NSDate它将无效(该值将设置为nil)。所以我认为在代码中使用NSDateFormatter可以工作(因为这是界面构建器为用户查看日期的工作方式):

 let dateFormatter = NSDateFormatter()
 dateFormatter.dateStyle = NSDateFormatterStyle.NoStyle
 dateFormatter.timeStyle = NSDateFormatterStyle.ShortStyle
 let date = dateFormatter.dateFromString((value?.description)!)

在上面的代码中,我创建了日期格式化程序,然后将日期样式设置为空(我只想做时间),并将时间样式设置为短。但是给出value.description(“23534.2261709793”)仍然行不通。日期仍然是零。

我有什么问题吗?

1 个答案:

答案 0 :(得分:2)

您从NSUserDefaults存储/获取的双精度是从1970年1月1日星期四起的时间间隔。因此,您需要将该时间间隔提供给NSDate构造函数,以便它可以为您构建日期。

let value = NSUserDefaults.standardUserDefaults().objectForKey("startTimeValue") as? Double
let date = NSDate(timeIntervalSince1970: value)