如何将变量保存到 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?

应用退出时如何确保 NSUserDefaults 设置保存到磁盘?

Swift 将图像(截图)保存到 nsuserdefaults

将带有按钮的 UIScrollview 保存到 NSuserdefaults