Я не проверял это, но похоже, что вы хотите это:
NSString *search = @"small widget";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ contains[cd] size AND %@ contains[cd] category", search, search];
Строка поиска будет содержать (или не содержать) размер и категорию, вам следует спросить, содержится ли в строке поиска текущий размер или категория.
Вы также можете разбить строку поиска и изменить свой предикат. Вы должны их идентифицировать тот, который работает лучше
NSString *search = @"small widget";
NSArray *array = [search componentsSeparatedByString:@" "];
NSMutableArray *subPredicates = [NSMutableArray array];
for (NSString *q in array) {
[subPredicates addObject:
[NSPredicate predicateWithFormat:@"size contains[cd] %@ OR category contains[cd] %@", q, q]];
}
NSCompoundPredicate *predicate = [[[NSCompoundPredicate alloc] initWithType:NSAndPredicateType
subpredicates:subPredicates] autorelease];