#ios #swiftui #ios14 #mpmediaitem #xcode12
#iOS #swiftui #ios14 #mpmediaitem #xcode12
Вопрос:
Только что обновлен до Xcode 12.0 с последней версии Xcode 11 / iOS13, и я получаю сообщение об ошибке в AppDelegate: Thread 1: "Subclass MPMediaItem must implement -valueForProperty: defined in [MPMediaItem class]."
При запуске приложения я MPMediaQuery использую библиотеку для песен и сохраняю их в переменной @Published в наблюдаемом объекте, подобном этому:
@Published var songs = [MPMediaItem]()
init() {
self.songs = MPMediaQuery.songs().items
}
Позже, когда я захочу получить доступ к свойству, я делаю так:
Text(self.observableObject.songs[0].title)
Я пытался изменить их для использования .value(forProperty: "MPMediaItemPropertyTitle")
, но не похоже, чтобы использовать строку над свойством (и затем Xcode выдает ошибки типа Failed to produce diagnostic for expression; please file a bug report apple.
) AFAIK, я нигде не подклассирую MPMediaItem, и я безуспешно пытался найти ошибку выше.
Кто-нибудь знает, что происходит?
Комментарии:
1. Кто-нибудь нашел решение этой проблемы?.
Ответ №1:
Я не уверен, полезно ли это для вашей ситуации, но недавно я столкнулся с аналогичной проблемой.
В моем случае мне нужно было изменить 2 вещи, которые вызвали этот сбой:
-
Я инициализировал пустое
MPMediaItem()
место в качестве заполнителя, когда текущая песня не была загружена. Сбой произошел при попытке получить доступ к свойству (напримерtitle
,) в этом пустом экземпляре. После удаления пустогоMPMediaItem()
и внедрения другого подхода к заполнителю проблема исчезла. -
Чтобы протестировать музыку на симуляторе, я использовал a
DummyMediaQuery: MPMediaQuery
, который возвращал массивDummyMediaItem: MPMediaItem
. ВDummyMediaItem
классе , который я делал:
final class DummyMediaItem: MPMediaItem {
private let _artist: String
override var artist: String { return _artist }
private let _title: String
override var title: String { return _title }
// and so on...
// fix: crash in iOS 14
override func value(forProperty property: String) -> Any? {
return nil
}
}