如何将变量保存到 NSUserdefaults 而不会出现致命错误
Posted
技术标签:
【中文标题】如何将变量保存到 NSUserdefaults 而不会出现致命错误【英文标题】:How to save variable to NSUserdefaults without fatal error 【发布时间】:2016-06-30 08:08:22 【问题描述】:点击UICollectionView
单元格时,我试图将一些变量保存到NSUserDefaults
,但出现以下错误。
致命错误:在展开可选值时意外发现 nil
这是我在点击单元格时使用的代码。
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath)
// handle tap events
let text = Globals.sinceLabelArray[indexPath.item]
userDefaults.setObject(text, forKey: "sinceText")
let image = String(Globals.imagesArray[indexPath.item])
userDefaults.setObject(image, forKey: "khoury")
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let daydate = Globals.datesArray[indexPath.item] as String
userDefaults.setObject(daydate, forKey: "day")
performSegueWithIdentifier("menutohome", sender: nil)
这是它影响的视图,以及如何影响。
let day = userDefault.objectForKey("day") as? NSDate
let date1 = day
let date2 = NSDate()
let diffDateComponents = NSCalendar.currentCalendar().components([NSCalendarUnit.Day, NSCalendarUnit.Hour, NSCalendarUnit.Minute, NSCalendarUnit.Second], fromDate: date1!, toDate: date2, options: NSCalendarOptions.init(rawValue: 0))
谢谢
【问题讨论】:
【参考方案1】:我认为您将 dayDate 设置为字符串
let daydate = Globals.datesArray[indexPath.item] as String // <- String
userDefaults.setObject(daydate, forKey: "day")
当你把它调用为 NSDate 时
let day = userDefault.objectForKey("day") as? NSDate // <- NSDate
更新:
您可以先将 dateObject 作为 String 保存到 NSUserDefaults 中。一旦你想使用它,然后使用 dateFormatter 将其设置为 NSDate。
例子:
当你从 NSUserDefaults 回调它时
let day = userDefault.objectForKey("day") as? String
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" // this format must equal to what it returns from the server
let dayDate: NSDate = dateFormatter.dateFromString(day)
print(dayDate) // your NSDate
【讨论】:
我应该怎么做才能解决这个问题?【参考方案2】:如果您不确定变量是否为 nil,请在使用前尝试使用条件语句,例如:
代替:
let text = Globals.sinceLabelArray[indexPath.item]
userDefaults.setObject(text, forKey: "sinceText")
使用:
if let text = Globals.sinceLabelArray[indexPath.item]
userDefaults.setObject(text, forKey: "sinceText")
else
print("error has happened here")
【讨论】:
以上是关于如何将变量保存到 NSUserdefaults 而不会出现致命错误的主要内容,如果未能解决你的问题,请参考以下文章
如何将 MPMediaItemCollection 保存到 NSUSerDefaults?
Swift:将 NSDictionary 保存到文件中,因为 NSUserDefaults 会变慢
应用退出时如何确保 NSUserDefaults 设置保存到磁盘?