Как сохранить область видимости даже после нажатия кнопки "Отмена"?

У меня есть UITableView с панелью поиска в верхней части. Я использовал UISearchDisplayController для реализации того же. А также имеет панель с двумя кнопками. По умолчанию при запуске приложения отображается панель области. Когда я нажимаю кнопку отмены после поиска, область действия исчезает. Так есть ли способ сохранить область видимости даже после того, как я нажал кнопку Отмена. Я использовал следующий код, но он не работает.

- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar
{
    [searchBar setShowsScopeBar:YES];
    return YES;
}

Спасибо:)

3 ответа

У меня была проблема сегодня, и я думаю, что нашел решение.

Вам нужно сделать две вещи:

  1. Вызовите "sizeToFit" на панели поиска после настройки показывает "Область видимости". Это обеспечит правильную установку фрейма searchBars для включения области видимости.
  2. К сожалению, табличному представлению не нравится, когда 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;
    }
}
Другие вопросы по тегам