Как предварительно загрузить или инициализировать поиск с помощью UISearchDisplayController?

Я добавил 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

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

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


person LavaSlider    schedule 03.02.2011    source источник


Ответы (1)


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

- (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.

person aqua    schedule 03.02.2011
comment
Удивительно, я думал, что испробовал все возможные комбинации всех различных willBegins и didBegins, но я перемещал только часть reloadData, так как предыдущий поисковый тест всегда был в поле поиска. - person LavaSlider; 03.02.2011
comment
Я попытался, как вы предложили, переместить controller.searchBar.text = self.lastSearch и вуаля, это работает (что немного темно-вспышка, которую было бы неплохо не иметь). Кажется, мне даже не нужен reloadData. Спасибо. - person LavaSlider; 03.02.2011
comment
(О, и у меня было так много NSLogs. Они были у меня, когда я входил и выходил из методов и показывал содержимое полей и размеры массивов... он просто не обновлялся). - person LavaSlider; 03.02.2011
comment
@LavaSlider: мне потребовалось несколько часов, чтобы добавить все методы из файлов .h, а затем определить порядок вызовов функций и зависимостей. И я также столкнулся с вашей точной проблемой, поэтому я рад, что это избавило вас от некоторых проблем. - person aqua; 03.02.2011
comment
Разница, которая здесь имеет значение, заключается в том, что это вызывается в didBegin вместо willBegin. - person Wil Macaulay; 04.12.2012
comment
Нет, это setText против searchBar.text. Да, важно, где это выполняется. Но то, что выполняется, было предметом беспокойства здесь. - person aqua; 02.08.2013