IOS: имя фильтра UISerachBar, но не связанный с ним идентификатор
У меня есть JSON
Dict
в этом формате
{
"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];