UISearchDisplayController с UISearchBar и UITableView - как избежать «живых результатов»? - PullRequest
1 голос
/ 05 января 2011

Я реализовал SearchBar, используя UISearchDisplayController и UITableView для отображения результатов поиска. Я использую libxml2 и xpath для анализа HTML-сайта и поиска содержимого, необходимого в исходном коде. Поскольку я новичок в ObjC, я использовал образец проекта TableSearch, предоставленный Apple, для поиска и отображения части в качестве начала. С этим все работает нормально, я могу анализировать определенное содержимое с веб-сайта и правильно комбинировать их, когда они появляются на веб-сайте, и отображать их в разных строках таблицы. Я хочу использовать пользовательский ввод для поиска определенного веб-сайта. У меня только следующая проблема:

Если вы посмотрите на проект TableSearch (класс MainViewController.m), вы заметите, что он обновляет «FilterListContent» и перезагружает TableView, отображая его автоматически при вводе пользователем:

[...]

#pragma mark -
#pragma mark Content Filtering

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
 /*
  Update the filtered array based on the search text and scope.
  */

 [self.filteredListContent removeAllObjects]; // First clear the filtered array.

 /*
  Search the main list for products whose type matches the scope (if selected) and whose name matches searchText; add items that match to the filtered array.
  */
 for (Product *product in listContent)
 {
  if ([scope isEqualToString:@"All"] || [product.type isEqualToString:scope])
  {
   NSComparisonResult result = [product.name compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
            if (result == NSOrderedSame)
   {
    [self.filteredListContent addObject:product];
            }
  }
 }
}


#pragma mark -
#pragma mark UISearchDisplayController Delegate Methods

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText:searchString scope:
   [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];

    // Return YES to cause the search result table view to be reloaded.
    return YES;
}


- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
{
    [self filterContentForSearchText:[self.searchDisplayController.searchBar text] scope:
   [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];

    // Return YES to cause the search result table view to be reloaded.
    return YES;
}


@end

Вы можете себе представить, что это требует некоторой памяти, когда я использую мою реализацию для синтаксического анализа и поиска, и это особенно важно, когда он вызывается несколько раз, когда пользователь печатает, чтобы отобразить "живые результаты". Когда я использую только первую строку моего блока для анализа и поиска (инициализация объекта NSData с помощью URL), SearchBar начинает отставать и задерживается на несколько секунд после ввода каждого символа. Когда я использую весь блок, приложение вылетает. Мой вопрос следующий:

Как можно дождаться нажатия кнопки «Поиск» или «Возврат» на клавиатуре, прежде чем выполнять поиск или где и как я могу проверить, была ли нажата кнопка? Извините за этот, возможно, тривиальный вопрос.

1 Ответ

6 голосов
/ 05 января 2011

Сделайте ваш объект делегата также делегатом панели поиска и реализуйте эти методы следующим образом:

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    [self filterContentForSearchText:[self.searchDisplayController.searchBar text]
                               scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
    return NO;
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
    return NO;
}

Это предотвратит перезагрузку табличного представления при вводе пользователем или изменении области и перезагрузку, когдакнопка поиска нажата.Однако таблица перезагружается при вводе первого символа.Я еще не нашел способ предотвратить это действие.Таким образом, таблица, скорее всего, не даст результатов, когда будет введен первый символ.

...