Поиск предикатов на основе iOS-ковонов возвращается только в том случае, если найдено точное соответствие - PullRequest
1 голос
/ 28 сентября 2011

Я добавляю панель поиска к компоненту табличного представления моего приложения для iOS, которое позволяет осуществлять поиск через NSArray, состоящий из словарей.Однако панель поиска работает не всегда - она ​​успешно выводит результат, если для моих данных есть точное совпадение, но не частичное совпадение.Например, он напечатает «Выключить свет» в результате, если будет введена эта точная фраза, но не если будет введен только «Поворот».Однако в массиве отладки, состоящем только из строк, функция поиска работала точно так, как ожидалось.

Мой код предиката находится здесь:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", searchText];

self.searchResults = [allSearchableItems filteredArrayUsingPredicate:resultPredicate];

}

Фактически работающий тестовый блок был написан так:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", searchText];

NSArray *array = [NSArray arrayWithObjects:@"Miguel", @"Ben", @"Adam", @"Melissa", nil];

NSArray *moreStuff = [array filteredArrayUsingPredicate:resultPredicate];

NSLog(@"%@", moreStuff);

self.searchResults = [allSearchableItems filteredArrayUsingPredicate:resultPredicate];

}

В приведенном выше блоке кода NSArray «moreStuff» распечатывается и корректно обновляется, однако в первом блоке NSArray «searchResults» возвращает результат только при вводе точного соответствия.Я в полном недоумении, поэтому любая помощь / рекомендации будут очень признательны.

1 Ответ

5 голосов
/ 28 сентября 2011

Поскольку вы ищете строку в объекте, я думаю, вам просто нужно немного покопаться в вашем предикате.Строка внутри объекта является только частичным совпадением этого объекта.Когда вы используете SELF в предикате, вы указываете поиск в самом объекте, который в вашем случае является NSDictionary.Строковые поля в NSDictionary по сути являются объектами внутри объекта.Поэтому, если вы ищете поле с именем «Name» в своем словаре, вместо того, чтобы предикат просматривался в SELF, он должен выглядеть в SELF.Name.Вы можете попробовать следующий код для поиска в поле Name вашего NSDictionary.

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF.Name CONTAINS[cd] %@", searchText];

self.searchResults = [allSearchableItems filteredArrayUsingPredicate:resultPredicate];

}

Если вам все еще нужно проверить другие поля, содержащиеся в объекте, вы можете создать составной предикат.Подробную информацию о предикатах можно найти в Руководстве по программированию предикатов Apple.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...