UserDefaults to Image 代码构建,但在运行时崩溃

问题描述

我从大量 StackOverFlow 帖子中读取代码,这似乎是一个相当简单的过程,但是当我尝试在自己的代码中实现我学到的东西时,它失败了。

在我的“ViewController” didSelectRowAt 函数中,我初始化了用户默认值

let song = tableViewData[indexPath.section].songData[indexPath.row - 1]
let songImage = song.artwork

UDM.shared.defaults.setValue(song.title,forKey: "name")
UDM.shared.songCover.setValue(songImage,forKey: "cover")

然后创建一个类来保存 UserDefaults

class UDM{
static let shared = UDM()

//let defaults = UserDefaults(suiteName: com.CTMVenturesInc.MusicTesters.saved.data)
let defaults = UserDefaults()
let songCover = UserDefaults()

//other funcs
}

在我的“TealViewController”之后,我创建了标签和图像元素

@IBOutlet var label: UILabel!
@IBOutlet var coverImage: UIImageView!

最后在 TealViewController 的 viewDidLoad 中设置值

if let value = UDM.shared.defaults.value(forKey: "name") as? String{
    label.text = value
}
    
if let value = UDM.shared.songCover.value(forKey: "cover") as? MPMediaItemArtwork{
    coverImage.image = value.image(at: CGSize(width: 400,height: 400))
}

这仅与默认文本一起运行并完美运行,但是当我尝试包含图像代码时,我收到此运行错误

Thread 1: "Attempt to insert non-property list object <MPConcreteMediaItemArtwork: 0x2830c4c80> for key cover"

所以我找到了这篇文章 Save images in NSUserDefaults? 并尝试在我的视图控制器中实现替换这个

UDM.shared.songCover.setValue(songImage,forKey: "cover")

有了这个

[UDM.shared.songCover.set: UIImagePNGRepresentation(songImage) forKey: "cover"]

但是得到一个找不到 forKey 的错误。我看了这篇文章 How to pass UI image from one view controller to another? 并尝试了这个

UDM.shared.songCover.standardUserDefaults().setObject(UIImagePNGRepresentation(songImage),forKey:"cover")}

还有更多错误

enter image description here

我没有在这里整理什么?

解决方法

问题 1

唯一可以保存到用户默认值的内容是 NSString、NSData、NSArray 和 NSDictionary(或桥接到它们的 Swift 类)。

MPMediaItemArtwork 不是其中之一; UIImage 也不是。

要将某些内容保存到用户默认设置中而不是其中之一,您必须归档以某种方式将其转换(序列化)为 NSData。使用 MPMediaItemArtwork 将无法做到这一点,因此您需要想出另一种策略来保存对您来说重要的关于此对象的任何内容。

举个例子(这似乎是你要去的地方),从 MPMediaItemArtwork 派生的 UIImage 可以存档到 NSData,现在你可以把它放到用户默认值中。

然而,这不是保存图像的好方法;最好将其数据直接作为文件保存到磁盘。

问题 2

用户默认值本身不是一些深层对象,您可以在其中写入它已经包含的对象的属性,并且具有两个不同属性的架构非常奇怪,这两个属性都只是 UserDefaults 的实例化。无需通过第二个对象,只需制作一段正确类型的数据,并调用 UserDefaults.standard.set... 以通过键进行设置。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...