如何将变量保存到NSUserdefaults而不会发生致命错误

时间:2016-06-30 08:08:23

标签: ios swift nsuserdefaults

我在点击NSUserDefaults单元格时尝试将某个变量保存到UICollectionView,但是我收到以下错误。

  

致命错误:在解包可选值时意外发现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))

由于

2 个答案:

答案 0 :(得分:1)

我认为您将dayDate设置为字符串

List<XWPFParagraph> paragraphs = document.getParagraphs();
XWPFRun run = paragraphs.get(0).insertNewRun(0); // first paragraph, 0 is the position
run.setText("your data here");

当你把它称为NSDate

let daydate = Globals.datesArray[indexPath.item] as String // <- String
userDefaults.setObject(daydate, forKey: "day")

更新:

您可以将dateObject首先保存为String,然后再保存到NSUserDefaults中。一旦你想使用它,然后使用dateFormatter使它成为NSDate。

示例:

当您从NSUserDefaults回电话时

let day = userDefault.objectForKey("day") as? NSDate // <- NSDate

答案 1 :(得分:1)

如果您不确定变量是否为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")
 }