2017-06-21 101 views
0

好的,我在這裏使用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) 
     } 
    } 
+0

你在用什麼框架?它是開源的(所以我或其他人可以偷看它?)?是'nowPlayingInfo'暴露爲'[String:NSObject]'字典或其他東西? –

+0

錯誤說'nowPlayingInfo'是一個由字符串鍵入的字典。您正試圖使用​​不是字符串的密鑰來獲取信息。我對這本詞典一無所知,但我注意到有一個名爲'MPMediaItemPropertyArtwork'的相關符號,**是一個字符串。 –

+0

菲利普米爾斯是正確的。在'extractMetadata'方法中,您可以清楚地看到圖像存儲在MPMediaItemPropertyArtwork鍵下,並且它的類型爲'MPMediaItemArtwork'。在你的代碼中你混淆了關鍵'MPMediaItemPropertyArtwork'和類型'MPMediaItemArtwork'。改變你的代碼:'如果讓artWork = AudioPlayerManager.shared.currentTrack?.nowPlayingInfo?[MPMediaItemPropertyArtwork]爲? MPMediaItemArtwork {// ...}' –

回答

1

nowPlayingInfo字典聲明。

但您正在嘗試使用類名爲MPMediaItemArtwork的東西。

通過閱讀MPNowPlayingInfoCenter類的概述(其中聲明瞭nowPlayingInfo)可以找到有效密鑰的列表。如您所見,鑰匙可以從MPMediaItem文檔中找到。

所以你需要用MPMediaItemPropertyArtwork替換MPMediaItemArtwork

+0

那真是愚蠢。謝謝! – skyguy

相關問題