2017-05-30 12 views
0

音楽トラックから情報を取得しようとしていますが、すべて正常に動作しますが、一部の音楽にはtitle,artistcover artworkがありません。この場合、デフォルト値Unknown音楽トラックからの情報の取得に関する問題

私はこのようなトラックの情報とテーブルビューを満たしています:トラックセルからのデータが、他のトラックとの例タイトルのためにそのデータを記入していないがある場合

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 


... setup cell 

let fileName = player.MP3DirectoryFiles[indexPath.row-2] as! NSString 
      let absoluteFileName = String(describing: fileName.lastPathComponent) 
      let removeSpaceString = absoluteFileName.replacingOccurrences(of: "%20", with: " ") 


      //Get MP3 Infromations 
      let documentsURL = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!,isDirectory: true) 
      let urlToMyPath = documentsURL.appendingPathComponent(removeSpaceString)! 

      player.getDataFromTrack(file: urlToMyPath) 

} 

:テーブルビューで

//MARK: - Get Data From Track : 
func getDataFromTrack(file:URL) { 

    //Get data from track 
    urlAsset = AVURLAsset(url: file) 
    for format in urlAsset.availableMetadataFormats { 

     for metadata in urlAsset.metadata(forFormat: format) { 

      //Track Name : 
      if metadata.commonKey == "title" { 
       if let title = metadata.stringValue { 
        appDefaults.setTrack(Name: title) 
       } else { 
        appDefaults.setTrack(Name: "Unknown") 
       } 
      } 



       //Track Artist: 
      if metadata.commonKey == "artist" { 
        if let artist = metadata.stringValue { 
         appDefaults.setArtist(Name: artist) 
        } else { 
         appDefaults.setArtist(Name: "Unknown") 
        } 
       } 


      //Track Cover: 
      if metadata.commonKey == "artwork" { 
       if let data = metadata.dataValue { 
        let image = UIImage(data: data) 
        appDefaults.setCover(Image: image!) 
       } else { 
        appDefaults.setCover(Image: #imageLiteral(resourceName: "Defualt cover")) 
       } 
      } 


      appDefaults.setTrack(duration: Float(CMTimeGetSeconds(urlAsset.duration))) 
     } 
    } 
} 

情報 !

私はこのようなnilの値を取得しようとしましたが、私を助けていない:

if metadata.commonKey == "artist" { 
        if let artist = metadata.stringValue { 
         appDefaults.setArtist(Name: artist) 
        } else { 
         appDefaults.setArtist(Name: "Unknown") 
        } 
       } 

答えて

1

は、最初のデフォルト値を設定してみてください、そして、対応するタグは、資産のために発見されたときにあればそれらを更新して:

//MARK: - Get Data From Track : 
func getDataFromTrack(file:URL) { 
    // Set defaults 
    appDefaults.setTrack(Name: "Unknown") 
    appDefaults.setArtist(Name: "Unknown") 
    appDefaults.setCover(Image: #imageLiteral(resourceName: "Defualt cover")) 
    appDefaults.setTrack(duration: Float(CMTimeGetSeconds(urlAsset.duration))) 

    //Get data from track 
    urlAsset = AVURLAsset(url: file) 
    for format in urlAsset.availableMetadataFormats { 
     for metadata in urlAsset.metadata(forFormat: format) { 

      //Track Name : 
      if metadata.commonKey == "title" { 
       if let title = metadata.stringValue, !title.isEmpty { 
        appDefaults.setTrack(Name: title) 
       } 
      } 

      //Track Artist: 
      if metadata.commonKey == "artist" { 
       if let artist = metadata.stringValue, !artist.isEmpty { 
        appDefaults.setArtist(Name: artist) 
       } 
      } 

      //Track Cover: 
      if metadata.commonKey == "artwork" { 
       if let data = metadata.dataValue { 
        let image = UIImage(data: data) 
        appDefaults.setCover(Image: image!) 
       } 
      } 
     } 
    } 
} 

アセットに適切なキーが含まれていない場合、デフォルト値を設定しようとするコードは呼び出されません。また、forループの中でトラックの持続時間を設定すると、不必要に複数回実行されます。

+0

ありがとうございました! –

関連する問題