0

У меня есть табличное представление с панелью поиска. Я был в состоянии использовать NSPredicate искать TableView, когда я добавить элементы в другой массив:NSPredicate to Search Collection

for(head in items){ 
    [desc addObject:head.DESC]; 
    [category addObject:head.CATEGORY]; 
} 

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"self CONTAINS[cd] %@", searchText]; 
searchResults = [desc filteredArrayUsingPredicate:resultPredicate]; 
} 

Теперь я хочу, чтобы сохранить коллекцию вместе с тем, что Tableview didSelectRowAtIndexPath будет иметь возможность использовать объект категории.

загружаю мой вид таблицы, как это:

for (int i = 0; i < [items count]; i++){ 
    head = [items objectAtIndex:indexPath.row]; 
    labelName.text = head.DESC; 

Как я могу получить мой NSPredicate искать коллекцию для head.DESC?

#pragma mark Search Results 
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
    { 
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"self CONTAINS[cd] %@", searchText]; 
searchResults = [items filteredArrayUsingPredicate:resultPredicate]; 
} 

В настоящее время я получаю это исключение при запуске вышеуказанного кода.

reason: 'Can't use in/contains operator with collection <Order: 0x7b22e900> (not a collection)' 

ответ

0

Я думаю, что я понимаю ваш вопрос. Вы хотите, чтобы иметь возможность фильтровать ваш массив items (который является связью head s) от DESC. Как насчет использования блоков?

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 
    NSPredicate *resultPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 
     return [[evaluatedObject DESC] containsString:searchText]; 
    }]; 

    searchResults = [items filteredArrayUsingPredicate:resultPredicate]; 
} 

Если Order объект определяет DESC как @property (или иначе КВЦ Compliant), вы будете иметь возможность просто получить доступ к нему напрямую. Это должно работать:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"self.DESC CONTAINS[cd] %@", searchText]; 
    searchResults = [items filteredArrayUsingPredicate:resultPredicate]; 
} 
+0

Прости меня, я не имею большого понимания блоков. Этот элемент управления достигает конца не-void блока. Что мне нужно вернуть? – iDev

+0

Ha! Упс! В начале этой строки должно быть возвращено. Это моя ошибка. –

+0

Хорошо, это не сбой. Результаты поиска пустые. Есть ли способ без блоков? – iDev

0

Я думаю, что это поможет вам:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"ANY self.DESC CONTAINS[cd] %@", searchText]; 
    searchResults = [items filteredArrayUsingPredicate:resultPredicate]; 
} 
+0

это должно быть @ "self.DESC CONTAINS [cd]% @" NSMutableArray не NSArray. Спасибо хоть! – iDev