UILocalizedIndexedCollation - MPMediaQuery - PullRequest
1 голос
/ 20 ноября 2011

Следующий код, используется для разделения и добавления разделов в список песен.

    query = [MPMediaQuery songsQuery];
    [query addFilterPredicate: artistNamePredicate];            
    NSArray *itemsFromArtistQuery = [query items];  
    self.artist1 = [self partitionObjects:itemsFromArtistQuery collationStringSelector:@selector(title)];

Работает отлично. Однако, когда я пытаюсь сделать это с:

    query = [MPMediaQuery albumsQuery]; //same with playlistsQuery, artistsQuery, genresQuery
    [query addFilterPredicate: artistNamePredicate];            
    NSArray *itemsFromArtistQuery = [query collections];    
    self.artist1 = [self partitionObjects:itemsFromArtistQuery collationStringSelector:@selector(title)];

Я получаю ошибку SIGABRT каждый раз. Я отнес это к части кода «коллекции», так как это единственное отличие всего блока. Я попытался изменить «title» на «name», «albumTitle», «playlist», «genre» и т. Д., Но все равно получаю:

"-[MPConcreteMediaItemCollection title]: unrecognized selector sent to instance"

Кто-нибудь может мне здесь помочь? Я готова вырвать мои волосы!

благодарственные!

Бенбен

1 Ответ

2 голосов
/ 29 декабря 2011

Вы правы, что проблема в части коллекций.collationStringSelector: должен быть методом, который возвращает NSString для объектов, которые вы передаете, в данном случае MPMediaItemCollection.

(Это работало в первом случае, потому что вы передавали MPMediaItem, которые отвечают на title).

Здесь мы выбираем каждый MPMediaItemCollection из массива artistCollectionsа затем получить один MPMediaItem, который представляет всю коллекцию.Затем мы можем получить имя артиста и добавить его в массив.

query = [MPMediaQuery albumsQuery]; //same with playlistsQuery, artistsQuery, genresQuery
[query addFilterPredicate: artistNamePredicate];            
NSArray *artistCollections = [query collections];
NSMutableArray *artists = [NSMutableArray array];

for (MPMediaItemCollection *artist in artistCollections) {
    // get a single MPMediaItem that represents the collection
    MPMediaItem *representativeItem = [artist representativeItem];
    NSString *artistName = [representativeItem valueForProperty:MPMediaItemPropertyArtist];
    [artists addObject:artistName];
}

self.artist1 = [self partitionObjects:artists collationStringSelector:@selector(self)];

Теперь мы передаем массив из NSString, поэтому мы устанавливаем collationStringSelector: в self, который будет возвращатьимена художников как NSString.

...