Я хочу добавить в мое приложение UISearchBar.
У меня есть 3 NSDictionary, который содержит соответственно 3 массива (отсортировано). 3 NSDictionaries имеют одинаковый ключ (@"Elements"
), хранящийся в NSMutableArray с именем listObjects.
В конце 3-х диктов у меня такая ситуация:
[listObjects addObject:dictOne];
[listObjects addObject:dictTwo];
[listObjects addObject:dictThree];
У меня также есть FilterListContent для хранения массивов (для быстрого поиска).
filteredListContent = [[NSMutableArray alloc] initWithCapacity: [listObjects count]];
[filteredListContent addObjectsFromArray: listObjects];
Теперь первый вопрос: хранит ли в фильтре FilterListContent все 3 ключа dict из listObjects?
Тогда.
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope{
[self.filteredListContents removeAllObjects];
NSString *cellTitle;
for (cellTitle in listObjects){
NSComparisonResult result = [cellTitle compare:searchText options:NSCaseInsensitiveSearch range:NSMakeRange(0, [searchText length])];
if (result == NSOrderedSame){
[filteredListContents addObject:cellTitle];
}
}
}
Я получил сбой, когда начал печатать
NSComparisonResult result = [cellTitle compare:searchText options:NSCaseInsensitiveSearch range:NSMakeRange(0, [searchText length])];`
линия.
Должен ли быть ключ dict (@"Elements"
) для поиска во всех 3 массивах или?
Редактировать
Полный код
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSDictionary *dictionary = [listObjects objectAtIndex:section];
NSArray *array = [dictionary objectForKey:@"Elements"];
return [array count];
}
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope{
NSString *cellTitle;
for (NSDictionary *dict in listaObjects)
{
NSArray *elements = [dict objectForKey: @"Elements"];
for (NSString *cellTitle in elements)
if ([cellTitle compare: searchText options: NSCaseInsensitiveSearch range: NSMakeRange(0, [searchText length])] = NSOrderedSame)])
[filteredListContent addObject: cellTitle];
}}
#pragma mark -
#pragma mark UISearchDisplayController Delegate Methods
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{
[self filterContentForSearchText:searchString scope:
[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
// Return YES to cause the search result table view to be reloaded.
return YES;
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption{
[self filterContentForSearchText:[self.searchDisplayController.searchBar text] scope:
[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];
// Return YES to cause the search result table view to be reloaded.
return YES;
}
У меня все работает, но оно показывает содержимое всех массивов, даже если я набираю определенное слово. Что я делаю не так?