5

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

Но я хотел бы, чтобы предыдущий поиск показывался в следующий раз, когда пользователи касаются строки поиска, так как гораздо легче коснуться (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 

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

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

ответ

7

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

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

+0

Удивительно, я думал, что я пробовал всевозможные комбинации всех разных команд willBegins и didBegins, но я перемещал только часть 'reloadData', поскольку предыдущий тест поиска всегда находился в поле поиска. – LavaSlider

+0

Я пробовал, как вы предложили переместить 'controller.searchBar.text = self.lastSearch' и presto, он работает (что немного темно-flash, что было бы неплохо не иметь). Мне даже не кажется, что нужно 'reloadData'. Благодарю. – LavaSlider

+0

(О, и у меня было так много «NSLogs». У меня были они, когда я вводил и оставлял методы и показывал содержимое полей и размеры массива ... он просто не обновлялся). – LavaSlider

Смежные вопросы