Получение значений из массива

У меня есть поиск в моем приложении,

То, что я хочу сделать, - это когда пользователь вводит любой символ в searchBar, я хочу получить все значения, начиная с того же символа из моего массива.

Вот мой фрагмент кода, который я пробовал, но он падает.

for (int i=0; i<[arr count]; i++) {
    for(NSString *name in [[arr objectAtIndex:i] objectForKey:@"Merchant_Name"])
    {

        NSRange r = [name rangeOfString:searchText options:NSCaseInsensitiveSearch];

        if(r.location != NSNotFound)
        {
            if(r.location== 0)//that is we are checking only the start of the naames.
            {
                [arr addObject:name];

            }
        }

    }
}

Показывает ERROR: - [__ NSDictionaryM rangeOfString: options:]: непризнанный селектор, отправленный в экземпляр

Где я делаю ошибку?

Пожалуйста, помогите и заблаговременно.

РЕДАКТИРОВАТЬ:

arr =   {
        "Merchant_Id" = 1036;
        "Merchant_Name" = "Arzoo Hotels";
        "Merchant_Url" = "arzoo-hotels";
    },
        {
        "Merchant_Id" = 1037;
        "Merchant_Name" = "Ashika Mall";
        "Merchant_Url" = "ashika-mall";
    },
        {
        "Merchant_Id" = 1038;
        "Merchant_Name" = "At My Doorsteps";
        "Merchant_Url" = "at-my-doorsteps";
    },
        {
        "Merchant_Id" = 1039;
        "Merchant_Name" = "AVA Host";
        "Merchant_Url" = "ava-host";
    },
0
источник поделиться
3 ответа

Для этого вы должны фильтровать свой массив с помощью NSPredicate.

Изменение: использование предикатов и фильтрации гораздо читабельнее и понятнее. Как указано в комментарии, это может быть медленнее, но у вас, вероятно, не будет 10 000 строк 000+, которые вы хотите фильтровать, поэтому сохранение 0,00001 секунды, вероятно, не стоит писать код на 10 строк дольше.

Документация здесь.

И вот целый учебник о панели поиска и фильтрации данных.

Быстрый пример для фильтрации массива и получения значений, начинающихся с "a" или "c":

NSMutableArray *array =
    [NSMutableArray arrayWithObjects:@"Nick", @"Ben", @"Adam", @"Melissa", nil];

NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] 'a'"];
NSArray *beginWithB = [array filteredArrayUsingPredicate:bPredicate];
// beginWithB contains { @"Adam" }.

NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] 'e'"];
[array filterUsingPredicate:sPredicate];
+1
источник

Используя код ниже, вы можете выполнить прямой поиск

  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Merchant_Name LIKE[cd] '%@' ",searchText];
  NSArray *filter = [arr filteredArrayUsingPredicate:predicate];

Используя код ниже, вы можете выполнить индивидуальный поиск

  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Merchant_Name  beginswith[c] 'a'"];
  NSArray *aNames = [arr filteredArrayUsingPredicate:predicate]

-use этот код -And Установите делегат в Uitextfield.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSString *changedText = [textField.text stringByReplacingCharactersInRange:range withString:string];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF['Merchant_Name'] contains %@",changedText];
    NSArray *filter = [arraydata filteredArrayUsingPredicate:predicate];

    NSLog(@"%@%",changedText);

    return YES;
}
+1
источник

Существует NSMutableDictionary типа объект в arr, попробуйте это, чтобы избежать аварий:

 for(NSString *name in arr){
    if(![name isKindOfClass:[NSString class]]){
        continue;
    }

    NSRange r = [name rangeOfString:searchText options:NSCaseInsensitiveSearch];
    if(r.location != NSNotFound)
    {
        if(r.location== 0)//that is we are checking only the start of the naames.
        {
            [Array addObject:name];
        }
    }
    counter++;
}
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос