【问题标题】:Xcode12; New “Subclass MPMediaItem must implement -valueForProperty” errorXcode12;新的“子类 MPMediaItem 必须实现 -valueForProperty”错误
【发布时间】:2024-01-18 10:55:01
【问题描述】:

刚刚从 Xcode 11/iOS13 的最新版本更新到 Xcode 12.0,并且在 AppDelegate 中出现错误:Thread 1: "Subclass MPMediaItem must implement -valueForProperty: defined in [MPMediaItem class]."

当应用程序启动时,我 MPMediaQuery 歌曲库并将它们存储到 Observable 对象中的 @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并且我试过用谷歌搜索上面的错误,但没有成功。

有人知道发生了什么吗?

【问题讨论】:

  • 有人找到解决这个问题的方法吗?

标签: ios swiftui ios14 mpmediaitem xcode12


【解决方案1】:

我不确定这对您的情况是否有用,但我最近遇到了一个类似的问题。

在我的情况下,我需要更改引发此崩溃的两件事:

  1. 当没有加载当前歌曲时,我正在初始化一个空的 MPMediaItem() 作为占位符。尝试访问此空实例上的属性(例如title)时发生崩溃。删除空的MPMediaItem() 并实施不同的占位符方法后,问题就消失了。

  2. 为了在模拟器上测试音乐,我使用了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
    }
}

【讨论】: