我发现MPMediaQuery的深层嵌套结构难以导航。

我正在尝试获取每个部分的专辑标题,以显示在索引的UITableView中。

获取所有专辑的基本查询和代码:

let myQuery:MPMediaQuery = MPMediaQuery.albumsQuery()
myQuery.groupingType = MPMediaGrouping.Album
let allAlbums = myQuery.collections

// This prints the total number of albums (either way works)
// Or so I thought - but this does not give the album count per section
// I don't know what this is returning!
print("number albums \(myQuery.collections?.count)")
print("number albums \(allAlbums?.count)")

// this prints out the title of each album
for album in allAlbums!{
    print("---------------")
    print("albumTitle \(album.representativeItem?.albumTitle)")
    print("albumTitle \(album.representativeItem?.valueForProperty(MPMediaItemPropertyAlbumTitle))")
}

这处理TableView Index的内容:
  // create index title
    func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? {
        let sectionIndexTitles = myQuery.itemSections!.map { $0.title }
        return sectionIndexTitles
    }

    func tableView(tableView: UITableView, sectionForSectionIndexTitle title: String, atIndex index: Int) -> Int {
        return index
    }

    // tableview
    func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return (myQuery.itemSections![section].title)
    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // print("number of sections \(myQuery.itemSections?.count)")
        return (myQuery.itemSections?.count)!
    }

我不知该如何确定每个部分(其中一个部分是“A”,“B”等)的相册标题的打印方式,例如:

一个
艾比路
阿奇通宝贝
所有年轻的帅哥

宝贝星星闪耀
C
宇宙的东西

等等.....

最佳答案

我要回答我自己的问题。
我在此处在SO上发布了类似的问题,每个人都回答说无法完成,需要附加的数组以及自定义排序例程。那根本不是真的。
此代码使用“相册查询”的返回值:
1)建立一个TableView索引
2)按标题将专辑添加(使用Apple的排序)到表Sections
3)选择后开始播放专辑

这是证明它的Swift代码:

// Set up a basic Albums query
let qryAlbums = MPMediaQuery.albumsQuery()
qryAlbums.groupingType = MPMediaGrouping.Album

// This chunk handles the TableView Index
    //create index title
    func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? {
        let sectionIndexTitles = qryAlbums.itemSections!.map { $0.title }
        return sectionIndexTitles
    }

    func tableView(tableView: UITableView, sectionForSectionIndexTitle title: String, atIndex index: Int) -> Int {
        return index
    }

// This chunk sets up the table Sections and Headers
    //tableview
    func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return (qryAlbums.itemSections![section].title)
    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return (qryAlbums.itemSections?.count)!
    }

// Get the number of rows per Section - YES SECTIONS EXIST WITHIN QUERIES
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return qryAlbums.collectionSections![section].range.length
    }

// Set the cell in the table
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell:UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "cell")

    // i'm only posting the pertinent Album code here.
    // you'll need to set the cell details yourself.

        let currLoc = qryAlbums.collectionSections![indexPath.section].range.location
        let rowItem = qryAlbums.collections![indexPath.row + currLoc]
        //Main text is Album name
        cell.textLabel!.text = rowItem.items[0].albumTitle
        // Detail text is Album artist
        cell.detailTextLabel!.text = rowItem.items[0].albumArtist!
        // Or number of songs from the current album if you prefer
        //cell.detailTextLabel!.text = String(rowItem.items.count) + " songs"

        // Add the album artwork
        var artWork = rowItem.representativeItem?.artwork
        let tableImageSize = CGSize(width: 10, height: 10) //doesn't matter - gets resized below
        let cellImg: UIImageView = UIImageView(frame: CGRectMake(0, 5, myRowHeight-10, myRowHeight-10))
        cellImg.image = artWork?.imageWithSize(tableImageSize)
        cell.addSubview(cellImg)

        return cell
    }

// When a user selects a table row, start playing the album
// This assumes the myMP has been properly declared as a MediaPlayer
// elsewhere in code !!!

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let currLoc = qryAlbums.collectionSections![indexPath.section].range.location
        myMP.setQueueWithItemCollection(qryAlbums.collections![indexPath.row + currLoc])
        myMP.play()
    }

另外,这里有一些有用的注意事项:

1)列出查询中的所有专辑:
for album in allCollections!{
    print("---------------")
    print("albumTitle \(album.items[0].albumTitle)")
    print("albumTitle \(album.representativeItem?.albumTitle)")
    print("albumTitle \(album.representativeItem?.valueForProperty(MPMediaItemPropertyAlbumTitle))")
} // each print statement is another way to get the title

2)打印查询的一部分以查看其构造方式:
print("xxxx \(qryAlbums.collectionSections)")

我希望这对你们中的一些人有帮助-如果是的话,请投票!

关于ios - 快速使用MPMediaQuery获取索引的ableableview的专辑标题?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35903252/

10-09 05:43