好的,我在這裏使用MPMediaItems,我需要從MPMediaItemArtwork獲取圖像。問題是因爲我使用另一個框架,這imageWithSize in Swift3不適合我。我MPMediaItem似乎是在一個不同的格式:Swift:不能使用索引類型爲[String:NSObject]的下標值。
if let artWork = AudioPlayerManager.shared.currentTrack?.nowPlayingInfo?[MPMediaItemArtwork] as? MPMediaItemArtwork {
trackImg = artWork.image(at: CGSize(width: 300, height: 300))!
print("IMG: ",trackImg)
}
什麼也沒有打印,我得到錯誤:
cannot subscript value of [String:NSObject] with index of type MPMediaItemArtwork.Type
這是什麼意思?我怎樣才能從這裏把圖像變成UIImage?
在框架內,傢伙:作爲[String:NSObject]
所以你清楚你需要使用一個String
作爲重點
fileprivate func extractMetadata() {
Log("Extracting meta data of player item with url: \(url)")
for metadataItem in (self.playerItem?.asset.commonMetadata ?? []) {
if let _key = metadataItem.commonKey {
switch _key {
case AVMetadataCommonKeyTitle : self.nowPlayingInfo?[MPMediaItemPropertyTitle] = metadataItem.stringValue as NSObject?
case AVMetadataCommonKeyAlbumName : self.nowPlayingInfo?[MPMediaItemPropertyAlbumTitle] = metadataItem.stringValue as NSObject?
case AVMetadataCommonKeyArtist : self.nowPlayingInfo?[MPMediaItemPropertyArtist] = metadataItem.stringValue as NSObject?
case AVMetadataCommonKeyArtwork :
if
let _data = metadataItem.dataValue,
let _image = UIImage(data: _data) {
self.nowPlayingInfo?[MPMediaItemPropertyArtwork] = self.mediaItemArtwork(from: _image)
}
default : continue
}
}
}
// Inform the player about the updated meta data
AudioPlayerManager.shared.didUpdateMetadata()
}
fileprivate func mediaItemArtwork(from image: UIImage) -> MPMediaItemArtwork {
if #available(iOS 10.0, *) {
return MPMediaItemArtwork.init(boundsSize: image.size, requestHandler: { (size: CGSize) -> UIImage in
return image
})
} else {
return MPMediaItemArtwork(image: image)
}
}
你在用什麼框架?它是開源的(所以我或其他人可以偷看它?)?是'nowPlayingInfo'暴露爲'[String:NSObject]'字典或其他東西? –
錯誤說'nowPlayingInfo'是一個由字符串鍵入的字典。您正試圖使用不是字符串的密鑰來獲取信息。我對這本詞典一無所知,但我注意到有一個名爲'MPMediaItemPropertyArtwork'的相關符號,**是一個字符串。 –
菲利普米爾斯是正確的。在'extractMetadata'方法中,您可以清楚地看到圖像存儲在MPMediaItemPropertyArtwork鍵下,並且它的類型爲'MPMediaItemArtwork'。在你的代碼中你混淆了關鍵'MPMediaItemPropertyArtwork'和類型'MPMediaItemArtwork'。改變你的代碼:'如果讓artWork = AudioPlayerManager.shared.currentTrack?.nowPlayingInfo?[MPMediaItemPropertyArtwork]爲? MPMediaItemArtwork {// ...}' –