NSPredicate на NSDictionary - PullRequest
       16

NSPredicate на NSDictionary

9 голосов
/ 04 февраля 2011

Я пытаюсь создать разделы в табличном представлении на основе алфавита и отсортировать записи в алфавитном порядке по этим разделам.

Я собрал первую букву в каждой записи barsArray в barsArrayIndex, и ятеперь пытаюсь использовать NSPredicate для подсчета количества каждой буквы.

Я делаю это, следуя этому руководству .

Они используют NSArray и яЯ использую NSDictionary и не могу заставить его работать.Кто-нибудь может мне помочь?

Приложение вылетает при попытке показать представление с представлением таблицы в нем.В консоли отладчика отображается следующая ошибка:

* Завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Невозможно выполнить операцию подстроки с чем-то, что не является»Строка

Это мой код

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSString *alphabet = [bandsArrayIndex objectAtIndex:section];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", alphabet];
    NSArray *letters = [bandsArray filteredArrayUsingPredicate:predicate];

    return [letters count];
}

РЕДАКТИРОВАТЬ: Это мой barsArray.

Заголовок

NSMutableArray *bandsArray;

@property (nonatomic, retain) NSMutableArray* bandsArray;

Theреализация

// set array from plist
NSString *path = [[NSBundle mainBundle] pathForResource:@"Bands" ofType:@"plist"];
NSMutableArray* tmpArray = [[NSMutableArray alloc] initWithContentsOfFile:path];

self.bandsArray = tmpArray;

// sort array after name ascending
NSSortDescriptor *nameSorter = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
[bandsArray sortUsingDescriptors:[NSArray arrayWithObject:nameSorter]];

Ответы [ 3 ]

22 голосов
/ 04 февраля 2011

Вы имеете в виду, что bandsArray - это массив словарей? Если это так и при условии, что каждый словарь имеет ключ name, вы сможете изменить предикат на что-то вроде @"SELF.name beginswith[c] %@".

Если, с другой стороны, bandsArray на самом деле сам словарь, возможно, вы захотите сделать [[bandsArray allKeys] filteredArrayUsingPredicate...].

6 голосов
/ 01 августа 2013
#import <Foundation/Foundation.h>
// clang -framework Foundation Siegfried.m 
    int
main() {
    NSArray *arr = @[
        @{@"1" : @"Fafner"},
        @{@"1" : @"Fasolt"}
    ];
    NSPredicate *p = [NSPredicate predicateWithFormat: @"SELF['1'] CONTAINS 'e'"];
    NSArray *res = [arr filteredArrayUsingPredicate:p];
    NSLog(@"Siegfried %@", res);
    return 0;
}
0 голосов
/ 04 февраля 2011

Извините, я не заметил, что у вас есть NSArray of NSDictionaries.

Читать эту ветку: Использование NSPredicate для фильтрации NSArray на основе ключей NSDictionary

Когда вы используете NSDictionary, вы должны проверить его ключом ... Я не уверен, что вы используете правильный подход!

Я бы сделал что-то вроде: @implementation Word: NSObect { NSString * title; }

тогда я бы создал NSArray of Words и отфильтровал их: @ "название начинается с [c]% @"

...