2017-06-21 94 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

相关问题