UISearchDisplayController - как отобразить результат поиска только с выбранной кнопкой области, но пустой строкой поиска - PullRequest
9 голосов
/ 26 апреля 2010

UISearchDisplayController очень удобен, а реализация поиска довольно проста.

Однако я сталкиваюсь с проблемой, когда в моем приложении я хочу отобразить результат поиска с пустой строкой поиска, но с выбранной кнопкой области действия.

Похоже, что необходимо ввести строку поиска, чтобы инициализировать и отобразить таблицу результатов поиска.

Есть ли способы отобразить результат поиска сразу после того, как пользователь выбрал область, но еще не ввел поисковое слово?

Спасибо Билл

Ответы [ 3 ]

2 голосов
/ 01 мая 2011

когда вы нажимаете кнопку новой области видимости, selectedScopeButtonIndex срабатывает:

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption;

Вы можете захватить заголовок из поиска, используя:

[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]

Не будет работать с начальным индексом области, но вы можете просто отключить поиск, изначально основываясь на последнем использованном selectedScopeButtonIndex

1 голос
/ 06 июля 2011

Я следовал тому же самому и только что нашел что-то на форумах разработчиков Apple: UISearchDisplayController реализован так, что таблица результатов не будет отображаться, пока не будет введен какой-то текст.Также есть отчет об ошибке: ID # 8839635.

Я обошел его, поместив сегментированный элемент управления под панель поиска, имитируя панель области действия.

0 голосов
/ 03 декабря 2012

Вот обходной путь, который использует кнопки области действия. Главное - добавить дополнительный символ для областей, для которых вы хотите автоматически отображать результаты поиска, но убедитесь, что вы удалили его для областей, для которых вы не хотите этого делать.

Вам нужно будет реализовать searchBar:textDidChange, а также searchBar:selectedScopeButtonIndexDidChange:

// scope All doesn't do a search until you type something in, so don't show the search table view
// scope Faves and Recent will do a search by default
#define kSearchScopeAll 0
#define kSearchScopeFaves 1
#define kSearchScopeRecent 2

// this gets fired both from user interaction and from programmatically changing the text
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
    [self initiateSearch];
}


- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope{
    NSString *searchText = self.searchDisplayController.searchBar.text;
    // if we got here by selecting scope all after one of the others with no user input, there will be a space in the search text

    NSString *strippedText = [searchText stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    if ((selectedScope == kSearchScopeAll) && (strippedText.length == 0) && (searchText.length != 0)){ 
        self.searchDisplayController.searchBar.text = @"";
    } else {
        [self initiateSearch];
    }
}

-(void)initiateSearch{
    NSString *searchText = self.searchDisplayController.searchBar.text;
    NSInteger scope = self.searchDisplayController.searchBar.selectedScopeButtonIndex;
    if ((searchText.length == 0) && (scope != kSearchScopeAll)){
        self.searchDisplayController.searchBar.text = @" ";
    }
    switch (scope) {
        case kSearchScopeAll:
            [self searchAll:searchText];
            break;
        case kSearchScopeFaves:
            [self searchFavorites:searchText];
            break;
        case kSearchScopeRecent:
            [self searchRecents:searchText];
            break;

        default:
            break;
    }
}

// assume these trim whitespace from the search term
-(void)searchAll:(NSString *)searchText{
}

-(void)searchFavorites:(NSString *)searchText{
}

-(void)searchRecents:(NSString *)searchText{
}
...