2014-01-20 5 views
0

Я хочу фильтровать массив с помощью NSPredicate, и у меня есть некоторые проблемы с ним.NSPredicate: непризнанный селектор, отправленный в экземпляр

У меня есть NSArray с именем «recipes», где сохранены мои данные.

Вот мой код:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 
    NSPredicate *resultPredicate = [NSPredicate 
            predicateWithFormat:@"SELF contains[cd] %@", 
            searchText]; 
    NSArray *searchRecipe = self.recipe[0]; 
    searchResults = [searchRecipe filteredArrayUsingPredicate:resultPredicate]; 
} 

Когда я запускаю этот код, я получаю следующее сообщение об ошибке:

2014-01-20 15:40:16.729 Recipes Editor[909:60b] -[filteredArrayUsingPredicate:]: unrecognized selector sent to instance 0x15666f80 
2014-01-20 15:40:16.735 Recipes Editor[909:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[filteredArrayUsingPredicate:]: unrecognized selector sent to instance 0x15666f80' 
*** First throw call stack: 
(0x2f997f4b 0x39dd86af 0x2f99b8e7 0x2f99a1cb 0x2f8e94d8 0x12d01 0x12eeb 0x322fe3d9 0x3213f713 0x3213f6b3 0x3213f691 0x3212b11f 0x322fe149 0x321491cf 0x322bf261 0x322be807 0x322fdf77 0x322be525 0x302c67db 0x3214cdd9 0x322be453 0x32134a49 0x3037be9b 0x2f963183 0x2f962653 0x2f960e47 0x2f8cbc27 0x2f8cba0b 0x345f2283 0x3216f049 0x130c1 0x3a2e0ab7) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
(lldb) 

Почему filteredArrayUsingPredicate не может фильтровать мой массив?

ТНХ

+1

'self.recipe [0]' не похоже на 'NSArray'. Но включите отладочную информацию, и проблема будет раскрываться. –

+0

Определяется ли поиск Беакон? – revolver

+0

Да, поискBeacon является ошибкой. Но у меня такая же ошибка. – testoverblaireau

ответ

0

searchRecipe не появляется, чтобы быть NSArray. Добавьте это отладочный код:

NSArray *searchRecipe = self.recipe[0]; 
NSLog(@"searchRecipe type=%@", NSStringFromClass([searchRecipe class])); 
searchResults = [searchRecipe filteredArrayUsingPredicate:resultPredicate]; 
+0

У меня эта ошибка: завершение приложения из-за неотображенного исключения «NSRangeException», причина: «*** - [__ NSArrayI objectAtIndex:]: индекс 0 за пределами для пустого массива ' – testoverblaireau

+0

@semlh Итак, массив пуст?!? – trojanfoe

+0

моя ошибка, я забыл поместить данные в свое приложение для тестирования. С Data в массиве я получаю эту ошибку: «NSInvalidArgumentException», причина: '- [filterArrayUsingPredicate:]: непризнанный селектор отправлен в экземпляр 0x156b6a00' И этот журнал: searchBeacon type = ESTBeacon – testoverblaireau

0

Да Н2СО3 правильно сказали, что ваши self.recipe[0] не вернулись вы NSArray. Вам необходимо отлаживать ваш код либо с помощью точки останова, либо следующим образом:

if([searchRecipe isKindOfClass:[NSArray class]]){ 
    if(searchRecipe.count>0){ 
    searchResults = [searchRecipe filteredArrayUsingPredicate:resultPredicate]; 
    } 
    else{ 
     NSLog(@"array value %@", searchResults); 
    } 
    } 
else{ 
NSLog(@"Your return class isn't compatible"); 
} 

Таким образом, вы можете избежать сбоев.

1

Я хотел бы использовать filteredArrayUsingPredicate: метод NSArray как это:

NSArray* filteredArray = [array filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 

    BOOL result = NO; 

    // your evaluation code here 

    return result; 

}]]; 

evaluatedObject является текущим объектом. Вы можете легко проверить, что это за класс, и проверить все, что вы. Просто верните ДА, если evaluatedObject должен остаться после вашей оценки или вернуть НЕТ, если он не должен включаться в фильтрованный массив.

Но убедитесь, что массив является NSArray, а не что-то еще.

Смежные вопросы