1

プレイリストにあるMPMusicPlayerControllerのnowPlayingItemのトラック番号を把握しようとしています。これは、同じ曲が同じプレイリストに複数回表示される可能性があるという事実を除いて、非常に簡単です(両方が同じファイルを指しているため)。たとえば、プレイリストがSong 1、Song 2、Song 1、Song 3、Song 2で構成されている場合、nowPlayingItemがプレイリストの最初のアイテムか3番目のアイテムかを判断する方法に固執しています。

問題を解決するために私が得た最も近いことは、「プレイリスト内の番号」値を含む関連オブジェクト(NSNumber)を追加するMPMediaItemのカテゴリと、以前にプレイリスト内の各MPMediaItemにその値を設定するMPMusicPlayerControllerのカテゴリを作成することです。キューに追加します。

MPMediaItem + playlistNumber.h

#import <Foundation/Foundation.h>
#import <MediaPlayer/MediaPlayer.h>
#import <objc/runtime.h>
@interface MPMediaItem (playlistNumber)
-(NSNumber*)numberInPlaylist;
-(void)setNumberInPlaylist:(NSNumber *)number;
@end

MPMediaItem + playlistNumber.m

@implementation MPMediaItem (playlistNumber)
static NSString * numberInPlaylistKey;
-(NSNumber*)numberInPlaylist{
    return objc_getAssociatedObject(self, &numberInPlaylistKey);
}
-(void)setNumberInPlaylist:(NSNumber *)number{
    objc_setAssociatedObject(self, &numberInPlaylistKey, number, OBJC_ASSOCIATION_RETAIN);
}

@end

MPMusicPlayerController + NumberTracks.h

#import <Foundation/Foundation.h>
#import "MPMediaItem+PlaylistNumber.h"
#include <objc/runtime.h>
@interface MPMusicPlayerController (NumberTracks)

-(void)setQueueAndAddNumbersToItemCollection:(MPMediaItemCollection*)collection;
@end

MPMusicPlayerController + NumberTracks.m

#import "MPMusicPlayerController+NumberTracks.h"
@implementation MPMusicPlayerController (NumberTracks)
-(void)setQueueAndAddNumbersToItemCollection:(MPMediaItemCollection*)collection{
    /*
    NSEnumerator *enumerator = [[collection items] objectEnumerator];
    MPMediaItem * object;
    int numberInPlaylist = 1;
    while (object = [enumerator nextObject]) {
        NSNumber * number = [[NSNumber alloc] initWithInt:numberInPlaylist];
        [object setNumberInPlaylist:number];
        NSLog(@"%@", [object numberInPlaylist]);
        NSLog(@"%@", [[[collection items] objectAtIndex:numberInPlaylist-1] numberInPlaylist]);
        NSLog(@"%@", [[[collection items] objectAtIndex:numberInPlaylist-1] valueForProperty:MPMediaItemPropertyTitle]);
        numberInPlaylist++;
    }
    */
    /*
    for (int numberInPlaylist = 1; numberInPlaylist <= collection.count; numberInPlaylist++) {
        NSNumber * number = [[NSNumber alloc] initWithInt:numberInPlaylist];
        [[[collection items] objectAtIndex:numberInPlaylist-1] setNumberInPlaylist:number];
        NSLog(@"%@", [[[collection items] objectAtIndex:numberInPlaylist-1] numberInPlaylist]);
        NSLog(@"%@", [[[collection items] objectAtIndex:numberInPlaylist-1] valueForProperty:MPMediaItemPropertyTitle]);
        [number release];
    }
    */
    NSArray * items = [collection items];
    NSUInteger number = 1;
    for (MPMediaItem * item in items) {
        [item setNumberInPlaylist:[NSNumber numberWithInt: number++]];
        NSLog(@"%@", item.numberInPlaylist);

    }
    [self setQueueWithItemCollection:collection];
    [self play];
    [self pause];
    [self skipToBeginning];
    //The play/pause/skipToBeginnng is so that the nowPlayingItem is actually the first item in the queue
}
@end

NumberTracksカテゴリの実装では、numberInPlaylistの「プロパティ」の割り当てを実装する3つの異なる方法(2つの大きなコメント付きセクションと1つの大きなコメントなしセクション)を試しました。ただし、nowPlayingItem MPMediaItemを取得しようとすると、numberInPlaylist値は常に(null)を返します。私がやろうとしていることを実際に達成することは可能ですか?この時点で、私はそれができるという信念を徐々に失っています。

4

1 に答える 1

2

MPMusicPlayerController には indexOfNowPlayingItem という隠しプロパティがあります。残念ながら、私はそれを使用できません。なぜなら、Apple は私のアプリが私有財産/方法を使用することを拒否するからです.

于 2010-09-24T19:16:20.790 に答える