-1

我有一個tableView,它顯示了用戶音樂庫中播放列表的列表。我用來獲取此列表中的代碼是:所有的tableView單元格顯示相同作品的圖像播放列表的圖片

@implementation playlistsViewController 
{ 
    NSArray *playlists; 
    MPMediaQuery *playlistsQuery; 
} 

- (void)viewDidLoad 
{   
    self.title = @"Playlists"; 

    playlistsQuery = [MPMediaQuery playlistsQuery]; 
    playlists = [playlistsQuery collections]; 
} 

#pragma mark - Table view data source 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [playlists count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ .... 

    // Configure the cell... 

    MPMediaItem *rowItem = [playlists objectAtIndex:indexPath.row]; 

    cell.textLabel.text = [rowItem valueForProperty: MPMediaPlaylistPropertyName]; 

    cell.imageView.image = [self getAlbumArtworkWithSize:(CGSizeMake(44,44))]; 

    return cell; 
} 

然後我有getAlbumArtworkWithSize

- (UIImage *) getAlbumArtworkWithSize: (CGSize) albumSize 
{ 
    // IMAGE 

    MPMediaQuery *playlistQuery = [MPMediaQuery playlistsQuery]; 
    MPMediaPropertyPredicate *playlistPredicate = [MPMediaPropertyPredicate predicateWithValue: playlistTitle forProperty: MPMediaPlaylistPropertyName]; 
    [playlistQuery addFilterPredicate:playlistPredicate]; 

    for (MPMediaPlaylist *playlist in playlists) { 
     NSLog (@"%@", [playlist valueForProperty: MPMediaPlaylistPropertyName]); 

     NSArray *songs = [playlist items]; 

     for (int i = 0; i < [songs count]; i++) { 

      MPMediaItem *mediaItem = [songs objectAtIndex:i]; 
      UIImage *artworkImage; 

      MPMediaItemArtwork *artwork = [mediaItem valueForProperty: MPMediaItemPropertyArtwork]; 
      tempImage = [artwork imageWithSize: CGSizeMake (1, 1)]; 

      if (tempImage) { 
       tempImage = [artwork imageWithSize:albumSize]; 
       playlistImage = artworkImage; 
       return artworkImage; 
      } 
     } 
    } 
return [UIImage imageNamed:@"Songs.png"]; 
} 

這段代碼的含義:它循環通過播放列表中的所有歌曲,直到它找到與專輯中的歌曲藝術品,因爲一些歌曲沒有任何藝術作品。然後它返回該圖像。

然而,這僅返回我的表相同圖形圖像的所有細胞。我如何運行getAlbumArtworkWithSize每個表格視圖單元格(播放列表名稱)

這是我目前得到:

This is what I currently get IMAGE http://i58.tinypic.com/29lxmjs.jpg

回答

0

這是因爲您沒有遍歷getAlbumArtworkWithSize方法中屬於該行的播放列表所特有的項目集合。爲了更方便和減少執行時間(不使你的方法,其他查詢),試圖收集傳遞給你的函數:

- (UIImage *)getAlbumArtworkWithSize:(CGSize)albumSize forPlaylist:(MPMediaItemCollection *)collection 
{ 
    for (MPMediaItem *mediaItem in collection.items) { 
     UIImage *artworkImage; 

     MPMediaItemArtwork *artwork = [mediaItem valueForProperty: MPMediaItemPropertyArtwork]; 
     tempImage = [artwork imageWithSize: CGSizeMake (1, 1)]; 

     if (tempImage) { 
      tempImage = [artwork imageWithSize:albumSize]; 
      playlistImage = artworkImage; 
      return artworkImage; 
     } 
    } 
    return [UIImage imageNamed:@"Songs.png"]; 
} 

然後使用它像這樣:

cell.imageView.image = [self getAlbumArtworkWithSize:CGSizeMake(44,44) forCollection:[playlists objectAtIndex:indexPath.row]]; 

我不會」不建議使用這種方法,播放列表中包含1000個項目可能會很慢。如果沒有圖像返回,最好使用集合的代表性項目並使用佔位符。這就像這樣:

- (UIImage *)getAlbumArtworkWithSize:(CGSize)albumSize forPlaylist:(MPMediaItemCollection *)collection 
{ 
     UIImage *artworkImage; 

     MPMediaItem *mediaItem = [collection representativeItem]; 
     MPMediaItemArtwork *artwork = [mediaItem valueForProperty: MPMediaItemPropertyArtwork]; 
     tempImage = [artwork imageWithSize: CGSizeMake (1, 1)]; 

     if (tempImage) { 
      tempImage = [artwork imageWithSize:albumSize]; 
      playlistImage = artworkImage; 
      return artworkImage; 
     } 
    return [UIImage imageNamed:@"Songs.png"]; 
} 
+0

感謝您的幫助。爲什麼我的原始方法在較大的播放列表中慢一些,如果它只是查找具有專輯封面的第一首歌曲?播放列表的前10個歌曲中肯定會有一首歌曲,不是嗎?只是好奇:) 另外,我使用了第二種更有效的方法,但是它並沒有爲我的所有播放列表返回代表性圖像,儘管他們擁有擁有專輯封面的歌曲。例如。儘管播放列表中有專輯封面,但排名前25位的播放次數最多 - [我的應用](http://i62.tinypic.com/15mk6rc.jpg)(請參閱[音樂應用](http://i62.tinypic.com/2zfny1y.png ))。 – user3127576

相關問題