UILocalizedIndexedCollation — MPMediaQuery

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

    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 каждый раз. Я приписал это части кода «коллекции», так как это единственное отличие во всем блоке. Я пытался изменить «название» на «имя», «название альбома», «список воспроизведения», «жанр» и многое другое, но все равно получаю:

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

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

БЛАГОДАРЮ ВАС!

БенБен


person topLayoutGuide    schedule 20.11.2011    source источник
comment
Учитывая приведенный ниже ответ, как вы справляетесь со случаем, когда есть две песни с одинаковым названием, и все, что вы разделили, представляет собой массив NSStrings (единственная информация, которая у вас есть в каждой строке/разделе)?   -  person sooper    schedule 04.03.2012
comment
Это довольно старое. Проблема была хорошо и действительно решена, хотя я не понимаю вашего вопроса? Вы имеете в виду, как я управляю выборкой с помощью этого метода разбиения?   -  person topLayoutGuide    schedule 04.03.2012
comment
Да, например, если вам нужно составить список коллекций альбомов, как вы поступите в случае, когда есть два альбома (разных исполнителей) с одинаковым названием, и все, что у вас есть для справки, — это название альбома, хранящееся в массиве NSStrings?   -  person sooper    schedule 05.03.2012
comment
Это не должно иметь никакого значения. Никак не влияет на мое приложение. Если вам нужна дополнительная помощь, напишите мне в Твиттере :) @cocotutch   -  person topLayoutGuide    schedule 18.03.2012
comment
sooper Просто укажите фильтр имени альбома.   -  person topLayoutGuide    schedule 31.05.2012


Ответы (1)


Вы правы, что проблема связана с частью коллекций. 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.

person steharro    schedule 29.12.2011
comment
Я сделал это, но в каждой ячейке отображается Неизвестный альбом? - person topLayoutGuide; 30.12.2011
comment
Только что заметил, что вы хотите перечислить все альбомы определенного исполнителя. В этом случае измените MPMediaItemPropertyArtist на MPMediaItemPropertyAlbumTitle. Поскольку запрос сгруппирован по альбомам и ограничен определенным исполнителем с помощью предиката, representativeItem для каждой группы в коллекции является альбомом, а не исполнителем. - person steharro; 30.12.2011
comment
Я изменил код, чтобы он соответствовал тому, что мне было нужно, спасибо. Тем не менее, в ячейках все еще написано «Неизвестный альбом» ... Возможно, мне придется проверить мой метод CellForIndexRow. - person topLayoutGuide; 30.12.2011