Как сохранить область видимости даже после нажатия кнопки "Отмена"?
У меня есть UITableView с панелью поиска в верхней части. Я использовал UISearchDisplayController для реализации того же. А также имеет панель с двумя кнопками. По умолчанию при запуске приложения отображается панель области. Когда я нажимаю кнопку отмены после поиска, область действия исчезает. Так есть ли способ сохранить область видимости даже после того, как я нажал кнопку Отмена. Я использовал следующий код, но он не работает.
- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar
{
[searchBar setShowsScopeBar:YES];
return YES;
}
Спасибо:)
3 ответа
У меня была проблема сегодня, и я думаю, что нашел решение.
Вам нужно сделать две вещи:
- Вызовите "sizeToFit" на панели поиска после настройки показывает "Область видимости". Это обеспечит правильную установку фрейма searchBars для включения области видимости.
- К сожалению, табличному представлению не нравится, когда searchBar изменяет размер и заставляет панель области перекрывать первую ячейку. Чтобы решить эту проблему, вы можете переустановить tableHeaderView как searchBar (снова), который, кажется, решает проблему перекрытия.
Финальный код:
- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar
{
self.searchBar.showsScopeBar = YES;
[self.searchBar sizeToFit];
self.tableView.tableHeaderView = self.searchBar;
return YES;
}
Я также боролся с этими видами UISearchBarController
проблемы последние несколько дней, и я должен сказать, что лучший способ сделать что-то необычное с помощью UISearchBar - это не использовать UISearchDisplayController
совсем!
Просто используйте UISearchBar
и UISearchBarDelegate
методы и сверните свои собственные, тогда вы можете настроить все, чтобы действовать именно так, как вы хотите.
Вот что я сделал в одном недавнем проекте. - Панель области видимости всегда остается видимой - я сразу фильтрую текст при вводе - я сразу фильтрую при изменении области видимости - я скрываю кнопку отмены, когда она не нужна - я скрываю клавиатуру, когда она не нужна
// Filters the table when requested
- (void)filterContentForSearchBar:(UISearchBar *)searchBar
{
NSString *scope = [[searchBar scopeButtonTitles] objectAtIndex:[searchBar selectedScopeButtonIndex]];
NSString *search = [searchBar text];
NSMutableArray *predicates = [[NSMutableArray alloc] init];
if ([scope isEqualToString:@"Selected"])
{
[predicates addObject:[NSPredicate predicateWithFormat:@"selected == 1"]];
}
if (search && search.length) {
[predicates addObject:[NSPredicate predicateWithFormat:@"name contains[cd] %@", search]];
}
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicates];
self.filteredObjectList = [self.objectList filteredArrayUsingPredicate:predicate];
[self.myTableView reloadData];
}
#pragma mark - UISearchBarDelegate Methods
// React to any delegate method we are interested in and change whatever needs changing
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
searchBar.showsCancelButton = true;
}
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
{
searchBar.showsCancelButton = false;
[searchBar resignFirstResponder];
searchBar.text = nil;
[self filterContentForSearchBar:searchBar];
}
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
searchBar.showsCancelButton = false;
[searchBar resignFirstResponder];
}
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
[self filterContentForSearchBar:searchBar];
}
- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope
{
[self filterContentForSearchBar:searchBar];
}
Работает отлично:)
Более правильный способ ответа - добавить логику для возвращаемого результата:
@property (nonatomic) BOOL shouldHideFirstResponder; //assign YES in init
- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar {
if (self.shouldHideFirstResponder) {
self.searchBar.showsScopeBar = YES;
[self.searchBar sizeToFit];
self.table.tableHeaderView = self.searchBar;
}
return self.shouldHideFirstResponder;
}
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
self.shouldHideFirstResponder = NO;
}
- (void)searchBarCancelButtonClicked:(UISearchBar *) searchBar {
self.shouldHideFirstResponder = YES;
}
- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
if (!self.searchBar.text || self.searchBar.text.length < 1) {
self.shouldHideFirstResponder = YES;
}
}