Все вышеперечисленные ответы велики, но я хотел бы прослушивать здесь. Если вы не обнаружили какой-либо проблемы, упомянутой выше, попробуйте очистить рабочую среду. Это сработало для меня.
Если взглянуть на ваш код, то он там правильный. Я столкнулся с проблемами при использовании этого метода для изменения поиска. Решение: Очистите свой кэш!
Допустим, вы инициировали контроллер fetched result следующим образом. Обратите внимание на свойство cacheName.
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:[self fetchRequest] managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"UserSearch"];
При изменении предиката просто добавьте:
[NSFetchedResultsController deleteCacheWithName:@"UserSearch"];
Как по волшебству, все будет работать отлично.
Вы также захотите отслеживать, когда контроллер отображения поиска завершит поиск, и сотрете свой предикат.
Хотя эта тема выглядит мертвой, я нашел ее в google, так что, возможно, кому-то это пригодится :)
.Похоже, вам просто интересно в извлечении и отображении объектов. В этом случае вы НЕ используете контроллер дисплея поиска. Контроллер дисплея поиска используется с панелью поиска, чтобы помочь разрешить вводимый пользователем текстовый поиск вашего контента.
Обычно вы используете выбранный контроллер результатов, чтобы помочь в реализации источника данных табличного представления и методов делегирования. Кроме того, вы создаете и используете запрос на выборку для контроллера полученных результатов. Это все шаблон (см. Код шаблона, предоставленный Apple, когда вы создаете новый проект с выбранной опцией «Использовать основные данные для хранения»).
Именно в запросе выборки вы можете создать и указать предикат. Это позволит вам фильтровать объекты, отображаемые в вашей таблице. Например:
// only fetch objects with myAttribute set to someValue
NSPredicate *pred = [NSPredicate predicateWithFormat:@"myAttribute == %@",someValue];
[fetchRequest setPredicate:pred];
Согласно документации, вы захотите либо отфильтровать результаты в массив с помощью предиката, либо повторно инициализировать fetchedResultsController.
Важно: вы не должны изменять получить запрос после того, как у вас есть инициализировал контроллер. Для Например, вы не должны изменять предикат или порядок сортировки.
(Я бы прокомментировал ответ простоя, но у меня нет кармы.)