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];
}
Другие вопросы по тегам