0

为了回答这个问题,我在一本书中遇到了这个问题。

“然而,MPMediaItem 有一个 MPMediaItemPropertyAssetURL 键(或assetURL 属性),其值为一个 URL。这为您提供了对磁盘上音乐文件的引用,...获得了 MPMediaItem 的资产 URL,您可以使用该 URL 来初始化一个AVAudioPlayer、AVPlayer 或 AVAsset。”

所以我尝试使用 mediaPickerController 来获取这样的资产 url。

    func mediaPicker(mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) {

    guard let mediaItem = mediaItemCollection.items.first else {
        NSLog("No item selected.")
        return
    }
    var songURL = mediaItem.valueForProperty(MPMediaItemPropertyAssetURL) as! NSURL
    print(songURL)
    self.dismissViewControllerAnimated(true, completion: nil)
}

在书中它举了一个例子:

let arr = // array of MPMediaItem
let items = arr.map {
    let url = $0.assetURL!
    let asset = AVAsset(URL:url)
    return AVPlayerItem(asset: asset)
}
self.qp = AVQueuePlayer(items:items)
self.qp.play()

我不确定如何将 mediaItemCollection 获取到 arr 变量。songURL 和 MediaItemCollection 的使用都在选择器 mediaPicker 函数内部。我无法在它的功能之外访问它。我怎样才能让它工作?

4

1 回答 1

3

好的。我想通了。

解决方法是先在函数外声明变量,但在类之下。我只是这样创建它:

class ViewController: UIViewController, MPMediaPickerControllerDelegate {

var songUrl: NSURL = NSURL()
var player = AVPlayer()


func mediaPicker(mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) {

    guard let mediaItem = mediaItemCollection.items.first else {
        NSLog("No item selected.")
        return
    }
    songUrl = mediaItem.valueForProperty(MPMediaItemPropertyAssetURL) as! NSURL
    print(songUrl)

    self.dismissViewControllerAnimated(true, completion: nil)
}

现在我可以在函数之外访问 songUrl。

于 2016-02-13T21:45:44.257 回答