Как реализовать SearchBar и контроллер отображения поиска в табличном представлении в Xib
У меня есть изменяемый массив со словарями. Я отображаю этот массив в табличном представлении.
Теперь я хочу реализовать поиск и отображение контроллера в виде таблицы. Как?
Любые предложения или код..
Здесь в моем массиве я показываю "имя" ключа в uitableview в алфавитном порядке.
[
{
"name": "Fish",
"description": "sdhshs",
"colorCode": null,
},
{
"name": "fry",
"description": "sdhshs",
"colorCode": null,
},
{
"name": "curry",
"description": "sdhshs",
"colorCode": null,
}
],
2 ответа
Вот пример кода
NSMutableArray *filteredResult; // this holds filtered data source
NSMutableArray *tableData; //this holds actual data source
-(void) filterForSearchText:(NSString *) text scope:(NSString *) scope
{
[filteredResult removeAllObjects]; // clearing filter array
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"SELF.restaurantName contains[c] %@",text]; // Creating filter condition
filteredResult = [NSMutableArray arrayWithArray:[tableData filteredArrayUsingPredicate:filterPredicate]]; // filtering result
}
Методы делегирования
-(BOOL) searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterForSearchText:searchString scope:[[[[self searchDisplayController] searchBar] scopeButtonTitles] objectAtIndex:[[[self searchDisplayController] searchBar] selectedScopeButtonIndex] ]];
return YES;
}
-(BOOL) searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
{
[self filterForSearchText:self.searchDisplayController.searchBar.text scope:
[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];
return YES;
}
В условии NSPredicate "@"SELF.restaurantName содержит [c] %@", текст" restaurantName "- это имя свойства, для которого необходимо выполнить фильтрацию. Если у вас есть только NSString в массиве источника данных, вы можете использовать как @ "SELF содержит [c]% @", текст
После того, как фильтр завершен, вам необходимо соответствующим образом реализовать свой делегат табличного представления. Что-то вроде этого
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if(tableView == [[self searchDisplayController] searchResultsTableView])
{
return [filteredResult count];
}
else
{
return [tableData count];
}
}
Сравните табличное представление, является ли оно фильтрованным табличным представлением или исходным табличным представлением, и соответственно установите делегат и источник данных для табличного представления. Обратите внимание, что searchDisplayController является доступным свойством для UIViewcontroller, и мы можем просто использовать его для отображения отфильтрованного результата.
Чтобы приведенный выше код работал, вам нужно использовать объект "Панель поиска и отображение поиска", если вы используете его в XIB или раскадровке
См. Следующие примеры кодов,
http://developer.apple.com/library/ios/samplecode/AdvancedTableSearch/Introduction/Intro.html
http://developer.apple.com/library/ios/samplecode/TableSearch/Introduction/Intro.html
http://www.appcoda.com/how-to-add-search-bar-uitableview/
Эти примеры могут дать вам лучшую идею