如何解决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")}
我没有在这里整理什么?
解决方法
问题 1
唯一可以保存到用户默认值的内容是 NSString、NSData、NSArray 和 NSDictionary(或桥接到它们的 Swift 类)。
MPMediaItemArtwork 不是其中之一; UIImage 也不是。
要将某些内容保存到用户默认设置中而不是其中之一,您必须归档以某种方式将其转换(序列化)为 NSData。使用 MPMediaItemArtwork 将无法做到这一点,因此您需要想出另一种策略来保存对您来说重要的关于此对象的任何内容。
举个例子(这似乎是你要去的地方),从 MPMediaItemArtwork 派生的 UIImage 可以存档到 NSData,现在你可以把它放到用户默认值中。
然而,这不是保存图像的好方法;最好将其数据直接作为文件保存到磁盘。
问题 2
用户默认值本身不是一些深层对象,您可以在其中写入它已经包含的对象的属性,并且具有两个不同属性的架构非常奇怪,这两个属性都只是 UserDefaults 的实例化。无需通过第二个对象,只需制作一段正确类型的数据,并调用 UserDefaults.standard.set...
以通过键进行设置。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。