【问题标题】:How to properly add predicate for Music Compilations in MPMediaItem如何在 MPMediaItem 中正确添加音乐编译的谓词
【发布时间】:2019-10-25 00:14:37
【问题描述】:

在我的应用中,我正在检查当前播放的歌曲是否是专辑的一部分。我能够做到这一点,但我发现如果专辑是合辑的一部分,我的代码将无法按预期工作。

我想要做的是,如果当前播放的歌曲是专辑的一部分,则启用按钮,如果不是,则不启用按钮。我的 iTunes 上有一个 ablum,其中所有歌曲的专辑名称完全相同,但在应用程序上该按钮未启用,但 iTunes 将专辑标记为合辑。

我用来查询的代码是

let albumPredicate = MPMediaPropertyPredicate(value: item.albumTitle, forProperty: MPMediaItemPropertyAlbumTitle)

我试过了

let compilationPredicate = MPMediaPropertyPredicate(value: item.isCompilation, forProperty: MPMediaItemPropertyIsCompilation)

以后

如果item.isCompilation == true 来确定我是否会将此谓词添加到过滤器集中。

我还需要注意,我不会意外禁用该按钮,因为当前播放的歌曲不是合辑的一部分,因为歌曲可以是专辑的一部分,但不是合辑,也可以在专辑和合辑中.

func getSongsWithCurrentAlbumFor(item: MPMediaItem) -> MPMediaQuery {

  let artistPredicateWithin = MPMediaPropertyPredicate(value: item.artist, forProperty: MPMediaItemPropertyArtist, comparisonType: .contains)
  let albumPredicate = MPMediaPropertyPredicate(value: item.albumTitle, forProperty: MPMediaItemPropertyAlbumTitle)

  let compilationPredicate = MPMediaPropertyPredicate(value: item.isCompilation, forProperty: MPMediaItemPropertyIsCompilation)

  var isComp: String
  var myFilterSet: Set<MPMediaPropertyPredicate>!

  if item.isCompilation == true {
    myFilterSet = [artistPredicateWithin, albumPredicate, compilationPredicate]
    isComp = "true"
  } else {
    myFilterSet = [artistPredicateWithin, albumPredicate]
    isComp = "false"
  }

  print(isComp)

  var query = MPMediaQuery(filterPredicates: nil)
  query = MPMediaQuery(filterPredicates: myFilterSet)
  query.addFilterPredicate(albumPredicate)
  albumQuery = query
  return albumQuery
}

我的代码做错了什么?

【问题讨论】:

    标签: swift mpmediaitem mpmediaquery


    【解决方案1】:

    MPMediaItemPropertyIsCompilation 属性的文档说明它应该被包装在一个 NSNumber 值中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-17
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多