2015-02-26 4 views
0

Я хочу отфильтровать список стран на основе либо названия страны, либо кода страны ISD. Например, если пользовательские типы «9», Индия должна быть добавлена ​​в фильтрованный массив, потому что ISD-код Индии «+91». Мой источник данных содержит всю информацию, как название страны, ISD код и т.д ..Получение ошибки, связанной с типом объекта NSDictionary

Вот как устроена моя массива:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    arrTotalCountries = [[NSMutableArray alloc] init]; 
    arrFilteredCountries = [[NSArray alloc] init]; 

    NSDictionary *dic1 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"1",@"India",@"IN",@"+91",nil] forKeys:[NSArray arrayWithObjects:@"CountryId",@"CountryName",@"CountryCode",@"ISDCode",nil]]; 
    NSDictionary *dic2 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"2",@"Australia",@"AU",@"+42",nil] forKeys:[NSArray arrayWithObjects:@"CountryId",@"CountryName",@"CountryCode",@"ISDCode",nil]]; 
    NSDictionary *dic3 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"3",@"New Zealand",@"NZ",@"+63",nil] forKeys:[NSArray arrayWithObjects:@"CountryId",@"CountryName",@"CountryCode",@"ISDCode",nil]]; 
    NSDictionary *dic4 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"4",@"South Africa",@"SA",@"+94",nil] forKeys:[NSArray arrayWithObjects:@"CountryId",@"CountryName",@"CountryCode",@"ISDCode",nil]]; 
    NSDictionary *dic5 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"5",@"England",@"EN",@"+75",nil] forKeys:[NSArray arrayWithObjects:@"CountryId",@"CountryName",@"CountryCode",@"ISDCode",nil]]; 
    NSDictionary *dic6 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"6",@"Israel",@"IS",@"+86",nil] forKeys:[NSArray arrayWithObjects:@"CountryId",@"CountryName",@"CountryCode",@"ISDCode",nil]]; 
    NSDictionary *dic7 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"7",@"Afghanistan",@"AF",@"+27",nil] forKeys:[NSArray arrayWithObjects:@"CountryId",@"CountryName",@"CountryCode",@"ISDCode",nil]]; 
    NSDictionary *dic8 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"8",@"Ireland",@"IR",@"+18",nil] forKeys:[NSArray arrayWithObjects:@"CountryId",@"CountryName",@"CountryCode",@"ISDCode",nil]]; 

    [arrTotalCountries addObject:dic1]; 
    [arrTotalCountries addObject:dic2]; 
    [arrTotalCountries addObject:dic3]; 
    [arrTotalCountries addObject:dic4]; 
    [arrTotalCountries addObject:dic5]; 
    [arrTotalCountries addObject:dic6]; 
    [arrTotalCountries addObject:dic7]; 
    [arrTotalCountries addObject:dic8]; 

    [self filterContentForSearchText:@"9"]; 
} 

А вот как я пытаюсь фильтровать массив. Я только что прошел статическую «9» для целей тестирования.

- (void)filterContentForSearchText:(NSString *)searchText 
{ 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SELF.CountryName BEGINSWITH[cd] %@) OR (SELF.ISDCode BEGINSWITH[cd] %@)", searchText]; 
    NSArray *filtered = [arrTotalCountries filteredArrayUsingPredicate:predicate]; 
    NSLog(@"%@",[filtered description]); 
} 

Я получаю следующую ошибку во время работы.

Нагрузочное приложение из-за неперехваченное исключение «NSInvalidArgumentException», причина: «Не можем сделать операцию подстроки с чем-то, что не является строка (LHS = +91 ки = ViewController)»

Я думаю, это потому, что в словаре есть значение типа «+91» для ключа «ISDCode». Как я могу решить эту проблему.

Пожалуйста, помогите мне. Я отчаянно нуждаюсь в ответе.

Спасибо заранее!

ответ

1

Ваш предикат требует два параметра, но вы передаете только 1, он должен быть

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SELF.CountryName BEGINSWITH[cd] %@) OR (SELF.ISDCode BEGINSWITH[cd] %@)", searchText, searchText]; 

только для подачи 1 параметра оперативной памяти было принято для второго и в этом случае оказался контроллер вид.

+1

Как в стороне, вам не нужно явно вводить 'SELF.' в предикат, поскольку это неявно сделано для вас. – Wain

+0

@ Wain, Он работал для меня как шарм. Я решил свою проблему. Большое вам спасибо за ваш ответ. Upvoted & Принято! – NSPratik

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