Как предварительно загрузить или инициализировать поиск с помощью UISearchDisplayController? - PullRequest
5 голосов
/ 03 февраля 2011

Я добавил UISearchDisplayController в свой UITableViewController в InterfaceBuilder. Было очень легко заставить его работать, добавив метод searchBar: searchBar textDidChange: searchText, который восстанавливает массив данных для таблицы и вызывает reloadData.

Но я бы хотел, чтобы предыдущий поиск отображался в следующий раз, когда пользователи касаются панели поиска, так как гораздо проще прикоснуться к (X) и очистить его, чем снова ввести его. Но я не могу заставить это сделать это. Ниже приведен код, который я пробовал:

- (void) searchBar: (UISearchBar *) searchBar textDidChange: (NSString *) searchText {
    if( searchText && [searchText length] > 0 ) {
        self.displayedRows = [[NSMutableArray initWithCapacity: 1];
        for( NSString *l in self.allRows ) {
            NSRange r = [l rangeOfString: searchText];
            if( r.location != NSNotFound )
                [self.displayedRows addObject: l];
        }
        [self.searchDisplayController.searchResultsTableView reloadData];
    }
}

- (void) searchDisplayControllerWillBeginSearch: (UISearchDisplayController *) controller {
    if( self.lastSearch && [self.lastSearch length] > 0 ) {
        controller.searchBar.text = self.lastSearch;
        [controller.searchResultsTableView reloadData];
    }
}

- (void) searchDisplayControllerWillEndSearch: (UISearchDisplayController *) controller {
    self.lastSearch = controller.searchBar.text;
    self.displayedRows = self.allRows;
    [self.tableView reloadData];
}

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

Я пытался поместить эквивалент [self.searchDisplayController.searchResultsTableView reloadData] в каждое из:

searchDisplayControllerDidBeginSearch: (UISearchDisplayController *) controller
searchDisplayController: (UISearchDisplayController *) controller didLoadSearchResultsTableView: (UITableView *) tableView
searchDisplayController: (UISearchDisplayController *) controller willShowSearchResultsTableView: (UITableView *) tableView
searchDisplayController: (UISearchDisplayController *) controller didShowSearchResultsTableView: (UITableView *) tableView

Но это не имело значения ... просто пусто, пока я что-то не наберу.

У кого-нибудь есть идеи, как получить предварительно загруженный результат поиска?

1 Ответ

7 голосов
/ 03 февраля 2011

Вам нужно что-то вроде этого:

- (void) searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller {
    if(lastSearch.length > 0) {
        NSLog(@"In searchDisplayControllerDidBeginSearch");
        [self.searchDisplayController.searchBar setText:lastSearch];
    }
}

Если вам нужно внести дополнительные изменения, я предлагаю открыть UIKit заголовки UISearchBar.h и UISearchDisplayController.h и посмотреть, что вы можете перегрузить и где. Также NSLog твой друг =)

Также

Просто чтобы объяснить, что происходит и чем это отличается от ...searchBar.text = lastSearch, setText заставляет textDidChange зарегистрироваться, что, в свою очередь, повторяет поиск и впоследствии вызывает shouldReloadTableForSearchString. Простое изменение текста без использования setText (по какой-то причине) не вызывает textDidChange.

...