NSCompoundPredicate
Я пытаюсь отфильтровать UITableView's
данные с использованием UISearchDisplayController
а также NSCompoundPredicate
, У меня есть пользовательская ячейка с 3 UILabels
что я хочу, чтобы все были отфильтрованы в поиске, следовательно, NSCompoundPredicate
,
// Filter the array using NSPredicate(s)
NSPredicate *predicateName = [NSPredicate predicateWithFormat:@"SELF.productName contains[c] %@", searchText];
NSPredicate *predicateManufacturer = [NSPredicate predicateWithFormat:@"SELF.productManufacturer contains[c] %@", searchText];
NSPredicate *predicateNumber = [NSPredicate predicateWithFormat:@"SELF.numberOfDocuments contains[c] %@",searchText];
// Add the predicates to the NSArray
NSArray *subPredicates = [[NSArray alloc] initWithObjects:predicateName, predicateManufacturer, predicateNumber, nil];
NSCompoundPredicate *compoundPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];
Однако, когда я делаю это, компилятор предупреждает меня:
Несовместимые типы указателей, инициализирующие NSCompoundPredicate *_strong выражением типа NSPredicate *
Каждый пример, который я видел в Интернете, делает то же самое, поэтому я в замешательстве. NSCompoundPredicate orPredicateWithSubpredicates:
метод принимает (NSArray *)
в последнем параметре, так что я действительно запутался.
В чем дело?
3 ответа
Прежде всего, использование "содержит" очень медленно, считают Mayber "начинается с"? Во-вторых, что вы хотите:
NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];
Три, вы могли бы просто сделать что-то вроде:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.productName beginswith[cd] %@ OR SELF.productManufacturer contains[cd] %@", searchText, searchText];
orPredicateWithSubpredicates:
определяется для возврата NSPredicate*. Вы должны иметь возможность изменить свою последнюю строку кода на:
NSPredicate *compoundPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];
... и до сих пор применяются все составные предикаты.
Вот полезный метод, который я создал на основе ответов выше (которые я очень благодарен!)
Это позволяет динамически создавать NSPredicate, посылая массив элементов фильтра и строку, которая представляет критерии поиска.
В исходном случае критерии поиска изменяются, поэтому это должен быть массив, а не строка. Но это может быть полезно в любом случае
- (NSPredicate *)dynamicPredicate:(NSArray *)array withSearchCriteria:(NSString *)searchCriteria
{
NSArray *subPredicates = [[NSArray alloc] init];
NSMutableArray *subPredicatesAux = [[NSMutableArray alloc] init];
NSPredicate *predicate;
for( int i=0; i<array.count; i++ )
{
predicate = [NSPredicate predicateWithFormat:searchCriteria, array[i]];
[subPredicatesAux addObject:predicate];
}
subPredicates = [subPredicatesAux copy];
return [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];
}