【问题标题】:UserDefaults to Image code builds, but crashes when ranUserDefaults to Image 代码构建,但运行时崩溃
【发布时间】:2021-05-17 00:25:13
【问题描述】:

我是从大量 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")}

还有更多错误

我没有在这里整理什么?

【问题讨论】:

  • 你在使用一些非常旧的 Xcode 版本吗?

标签: swift userdefaults mpmediaitem apple-music apple-musickit


【解决方案1】:

问题 1

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

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

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

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

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

问题 2

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多