When I try to save to ui colors with userDefaults, Xcode gives me the error : Fatal error: Unexpectedly found nil while unwrapping an Optional value

When I try to save to ui colors with userDefaults, Xcode gives me the error : Fatal error: Unexpectedly found nil while unwrapping an Optional value

我试图让我的应用在设置中保存 UIColors,当我尝试保存背景颜色的设置时,它起作用了。但是当我添加第二个代码块应该允许我保存第二个 UIColor 时,它给了我错误 - 致命错误:在展开可选值时意外发现 nil。谁能告诉我如何正确保存第二个 UIColor 吗?

      // First UIColor save - Works
    var dd = UIColor(hex: UserDefaults.standard.value(forKey: "TheMainUIColour") as! String )

    UserDefaults.standard.set(dd.toHexString, forKey: "TheMainUIColour")

    let  mainBackgroundColour = UserDefaults.standard.value(forKey: "TheMainUIColour") as! String

    let color = UIColor(hex: mainBackgroundColour)

    self.view.backgroundColor = dd

    // Second UIColor Save - Doesnt Work
    let dd2: UIColor = UIColor(hex: UserDefaults.standard.value(forKey: "TheMainUIColour2") as! String )
    UserDefaults.standard.set(dd2, forKey: "TheMainUIColour2")

    let  mainBackgroundColour2 = UserDefaults.standard.value(forKey: "TheMainUIColour2") as! String

    let color2 = UIColor(hex: mainBackgroundColour2)

问题是

   var dd2:UIColor = UIColor(hex: UserDefaults.standard.value(forKey: "TheMainUIColour2") as! String )

它从默认值读取不保存,不要使用!从默认值中读取,因为存储的值可能为 nil ,只需使用 if let 检查它是否存在于默认值中,如果存在则使用它,如果不保存您想要的值,当您再次打开应用程序时它会读取储值

   if let saved = UserDefaults.standard.string(forKey: "TheMainUIColour2") 
   {
       var dd = UIColor(hex:saved)
   }
   else
   {
        print("No saved color")

        let dd = UIColor.red

        UserDefaults.standard.set(dd.toHexString, forKey: "TheMainUIColour2")

   }

您的代码崩溃是因为没有为键 TheMainUIColour2 设置任何内容,但您随后 force-unwrap 那个 nil 值和您的应用程序崩溃。

你写的代码也没什么意义。您(尝试)加载当前值并从中创建颜色。然后,您不必要地将该值写回用户默认值。然后您再次读取该值作为字符串。然后您再次从字符串中创建颜色。

不要执行所有这些不必要的额外步骤。加载颜色(如果存在),仅此而已。此代码不应设置任何内容。您必须有其他代码来决定使用什么颜色。该代码应将颜色保存为用户默认值。

if let hexColor = UserDefaults.standard.string(forKey: "TheMainUIColour2") {
    let color2 = UIColor(hex: hexColor)
    // do something with the color
}