Как сохранить область видимости даже после нажатия кнопки «Отмена»? - PullRequest
3 голосов
/ 17 января 2012

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

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

Спасибо:)

Ответы [ 3 ]

5 голосов
/ 14 марта 2012

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

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

  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;
}
4 голосов
/ 23 октября 2012

В последние несколько дней я сам тоже боролся с этими 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];
}

Прекрасно работает:)

0 голосов
/ 20 июня 2013

Более правильный способ этого ответа - добавить логику для возвращаемого результата:

@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;
    }
}
...