我正在对媒体播放器进行第二次重写。第一个是在目标C中并且工作得很好。我在swift中建立的第二个主要是为了制作一个更高效的音乐播放器,并在新语言中加快速度。
在我的媒体选择器中,我试图在点击专辑后获得专辑歌曲。我可以按艺术家过滤,但是当我应用相册过滤器时,我得到一张空表。这是代码:
// Get the representative media item
var itemCollection: MPMediaItemCollection =
items!.objectAtIndex(itemRow) as MPMediaItemCollection
var mediaItem: MPMediaItem = itemCollection.representativeItem
//Build the query with predicate filters
var albumPredicate: MPMediaPropertyPredicate =
MPMediaPropertyPredicate(value: mediaItem.albumTitle,
forProperty: MPMediaItemPropertyAlbumTitle)
var artistPredicate: MPMediaPropertyPredicate =
MPMediaPropertyPredicate(value: mediaItem.artist,
forProperty: MPMediaItemPropertyAlbumArtist)
var noCloudPredicate: MPMediaPropertyPredicate =
MPMediaPropertyPredicate(value: NSNumber.numberWithBool(false),
forProperty: MPMediaItemPropertyIsCloudItem)
var query: MPMediaQuery = MPMediaQuery.songsQuery()
query.addFilterPredicate(noCloudPredicate)
query.addFilterPredicate(artistPredicate)
query.addFilterPredicate(albumPredicate)
如果我发表评论albumPredicate
,我会在所选艺术家下面找到所有歌曲的正确列表,这意味着我的故事板已正确连线。此外,mediaItem.albumTitle
会正确返回所选专辑标题。
答案 0 :(得分:1)
MPMediaItemCollection *itemCollection = [[self items] objectAtIndex:itemIndex];
MPMediaItem *mediaItem = [itemCollection representativeItem];
MPMediaPropertyPredicate *albumPredicate =
[MPMediaPropertyPredicate predicateWithValue:[mediaItem albumTitle]
forProperty:MPMediaItemPropertyAlbumTitle];
MPMediaPropertyPredicate *artistPredicate =
[MPMediaPropertyPredicate predicateWithValue:[mediaItem artist]
forProperty:MPMediaItemPropertyAlbumArtist];
MPMediaPropertyPredicate *noCloudPredicate =
[MPMediaPropertyPredicate predicateWithValue:[NSNumber numberWithBool:NO]
forProperty:MPMediaItemPropertyIsCloudItem];
MPMediaQuery *query = [MPMediaQuery songsQuery];
[query addFilterPredicate:noCloudPredicate];
[query addFilterPredicate:artistPredicate];
[query addFilterPredicate:albumPredicate];
我的理解是[MPMediaQuery songsQuery]
会选择歌曲并按歌曲分组。然后应用谓词。我想知道为什么它不能在swift中工作。
答案 1 :(得分:0)
我认为你不能复合专辑和艺术家谓词。我不得不写一个查询,返回艺术家的所有歌曲,然后撕掉它们并手动过滤相册。
这是我执行此操作的代码。
class func getArtistSongsWithoutSettingPlaylist(currentSong : MPMediaItem?) -> ([[MPMediaItem]], [MPMediaItem]) {
//album->*song
var songs = [MPMediaItem]()
var groupedSongs = [[MPMediaItem]]()
if currentSong != nil {
var query = MPMediaQuery.songsQuery()
var pred = MPMediaPropertyPredicate(value: currentSong!.albumArtist, forProperty: MPMediaItemPropertyAlbumArtist)
query.addFilterPredicate(pred)
var artistSongs = query.items as [MPMediaItem]
var albumDic = Dictionary<String,Array<MPMediaItem>>(minimumCapacity: artistSongs.count)
//fill up the dictionary with songs
for x in artistSongs {
if albumDic.indexForKey(x.albumTitle) == nil {
albumDic[x.albumTitle] = Array<MPMediaItem>()
}
albumDic[x.albumTitle]?.append(x)
}
//get them back out by album and insert into array of arrays
for (x,y) in albumDic {
var sorted = y.sorted { $0.albumTrackNumber < $1.albumTrackNumber }
groupedSongs.append(sorted)
}
//now sort the grouped playlist by year
groupedSongs.sort { $0[0].year > $1[0].year }
//now add all the groupplaylist into one big playlist for the media player
for album in groupedSongs {
songs.extend(album)
}
outputSongs(songs)
}
return (groupedSongs, songs)
}
答案 2 :(得分:0)
解决了!似乎我专注于错误的领域。当我只有一个部分时,override func tableView(tableView: UITableView, numberOfRowsInSection section: Int)
中的错误代码返回0,因此在按专辑过滤时没有显示任何行。卫生署!