【问题标题】: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当我尝试使用 userDefaults 保存到 ui 颜色时,Xcode 给了我错误:致命错误:Unexpectedly found nil while unwrapping an Optional value
【发布时间】:2018-03-21 21:20:18
【问题描述】:

我试图让我的应用程序在设置中保存 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)

【问题讨论】:

  • 不要使用value(forKey:)。使用string(forKey:)object(forKey:)UserDefaults 中记录的任何其他方法。但不要使用value(forKey:)setValue(_:forKey:)
  • UserDefaults.standard.set(dd2, forKey: "TheMainUIColour2")改成UserDefaults.standard.set(dd2. toHexString, forKey: "TheMainUIColour2")

标签: ios swift debugging colors userdefaults


【解决方案1】:

问题是

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

它从默认值中读取而不是保存,不要使用!从默认值读取,因为存储的值可能是 nil ,jsut 使用 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")

   }

【讨论】:

  • 在哪里添加?
  • 不要使用value(forKey:)
  • 其实两个块都需要修复。
  • 他说崩溃发生在第二个,但他确实应该照顾好两者,因为它们是相似的
  • 第一个应用程序在全新安装时也会崩溃。
【解决方案2】:

您的代码崩溃,因为没有为密钥 TheMainUIColour2 设置任何内容,但是您随后强制解开该 nil 值,您的应用程序崩溃了。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    相关资源
    最近更新 更多