IOS: имя фильтра UISerachBar, но не связанный с ним идентификатор

У меня есть JSONDict в этом формате

{
  "382" : "sudhir kumar",
  "268" : "David  ",
  "385" : "aayush test",
  "261" : "Mike watson",
  "277" : "TestDrivers Driver",
  "381" : "sudhir kumar",
  "380" : "sudhir kumar",
  "383" : "asdfgh asdfgh",
  "376" : " "
}

Я должен отобразить это в UISearchBar. Кто-то, пожалуйста, помогите мне решить эту проблему, так как, когда я выбираю любое имя из поиска, его соответствующий идентификатор также выбран

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

Мой код:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText;
{
    tempArray = [NSArray arrayWithArray:DriverNameArray];
    //NSString *stringToSearch = textField.text;

    tempId = [NSArray arrayWithArray:DriverIdArray];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF BEGINSWITH[c] %@",searchText]; // if you need case sensitive search avoid '[c]' in the predicate

    //NSPredicate * predicateid = [NSPredicate predicateWithFormat:@"SELF BEGINSWITH[c] %@",stringToSearch];

    NSArray *tempresults = [DriverNameArray filteredArrayUsingPredicate:predicate];
    if (tempresults.count > 0)
    {
        tempArray = [NSArray arrayWithArray:tempresults];
        tempId = [NSArray arrayWithArray:tempresults];
    }
    [SEarchTable reloadData];
    //return  YES;
}

Он всегда возвращает один и тот же идентификатор для всех отфильтрованных имен

2 ответа

Создайте NSarray из NSdictionary содержит идентификатор и имя

MasterArray :

(
 0{ id = "382" , drivername = "sudhir kumar"}
 1{ id = "383" , drivername = "sudha mishra"}
.
.
 n{ id = "384" , drivername = "sudesh pandit"}
)

любой результат поиска вы получите в свой DriverNameArray, Выполните итерацию цикла и сравните имя драйвера с MasterArray:

for(i = 0; i< DriverNameArray.count , i++)
{
    //take driver name from search result array
    NSString * driverName = [DriverNameArray objectAtIndex:i];
    for(j = 0; j< MasterArray.count , j++){// search driver name in MasterArray
        NSDictionary *driverInfoDic = [MasterArray objectAtIndex:j];
        if(driverName isEqualToString:[driverInfoDic objectForKey:@"drivername"])
            NSString *driverId = [driverInfoDic objectForKey:@"Id"];//use this driver id by storing it in DiverIdArray
    }
}

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

@property (nonatomic, strong) NSMutableArray *allElements
@property (nonatomic, strong) NSArray *filteredArray;

`

  for (int i=0; i < 10; i++) { //Just simple example
        NSDictionary *dictionary = @{@"name": DriverNameArray[i], @"id": DriverIdArray[i] };
        [self.allElements addObject:dictionary];

    }

И в вашем делегате панели поиска вы можете использовать:

NSArray *copyArray = [self.allElements copy];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH %@", searchText];

NSArray *filteredArray = [copyArray filteredArrayUsingPredicate:predicate];


self.filteredArray = filteredArray;

[self.tableView reloadData];
Другие вопросы по тегам