Код 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!

Наконец, в viewDidLoad TealViewController я установил значения

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"

Итак, я нашел этот пост Сохранить изображения в NSUserDefaults? и попытался реализовать в моем контроллере представления замену этого

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

с этим

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

Но получить не удается найти ошибку forKey. Я посмотрел на этот пост Как передать изображение пользовательского интерфейса с одного контроллера представления на другой? и попробовал это

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

и получил еще больше ошибок введите здесь описание изображения

Что я тут не сопоставляю?


person ctm    schedule 17.05.2021    source источник
comment
Вы используете очень старую версию Xcode?   -  person matt    schedule 17.05.2021


Ответы (1)


проблема 1

Единственное, что вы можете сохранить в пользовательских значениях по умолчанию, это NSString, NSData, NSArray и NSDictionary (или классы Swift, которые связаны с ними).

MPMediaItemArtwork не является одним из них; ни UIImage.

Чтобы сохранить что-то в пользовательских значениях по умолчанию, которые не являются одним из них, вы должны каким-то образом заархивировать это, то есть преобразовать (сериализовать) в NSData. Вы не сможете сделать это с MPMediaItemArtwork, поэтому вам нужно придумать другую стратегию для сохранения того, что важно для вас в этом объекте.

Просто чтобы привести пример (который, казалось, был тем, куда вы направлялись), UIImage, полученный из MPMediaItemArtwork, может быть заархивирован в NSData, и теперь вы можете поместить его в пользовательские значения по умолчанию.

Однако это не очень хороший способ сохранения изображения; было бы лучше сохранить его данные непосредственно в виде файла на диск.

проблема 2

Пользовательские значения по умолчанию сами по себе не являются каким-то глубоким объектом, в который вы можете записывать свойства объектов, которые он уже содержит, и ваша архитектура с двумя разными свойствами, оба из которых являются просто экземплярами UserDefaults, очень странная. Вместо того, чтобы проходить через второй объект, просто создайте часть данных нужного типа и вызовите UserDefaults.standard.set..., чтобы установить ее по ключу.

person matt    schedule 17.05.2021