如何在没有致命错误的情况下将变量保存到 NSUserdefaults
How to save variable to NSUserdefaults without fatal error
我试图在点击 UICollectionView
单元格时将一些变量保存到 NSUserDefaults
,但出现以下错误。
fatal error: unexpectedly found nil while unwrapping an Optional value
这是我在点击单元格时使用的代码。
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))
谢谢
我认为您将 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
如果您不确定变量是否为 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")
}
我试图在点击 UICollectionView
单元格时将一些变量保存到 NSUserDefaults
,但出现以下错误。
fatal error: unexpectedly found nil while unwrapping an Optional value
这是我在点击单元格时使用的代码。
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))
谢谢
我认为您将 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
如果您不确定变量是否为 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")
}