带有 UISearchBar 和 UITableView 的 UISearchDisplayController - 如何避免“实时结果”?

Posted

技术标签:

【中文标题】带有 UISearchBar 和 UITableView 的 UISearchDisplayController - 如何避免“实时结果”?【英文标题】:UISearchDisplayController with UISearchBar and UITableView - how to avoid "live results"? 【发布时间】:2011-01-05 03:11:23 【问题描述】:

我已经使用 UISearchDisplayController 和 UITableView 实现了一个 SearchBar 来显示搜索结果。我正在使用 libxml2 和 xpath 来解析 html 网站并搜索源代码中所需的内容。由于我是 ObjC 的新手,所以我使用 Apple 提供的示例项目 TableSearch 作为搜索和显示部分的开始。一切正常,我可以解析网站上的特定内容,并在它们出现在网站上时正确组合它们,并将它们显示在不同的 TableView 行的视图中。我想使用用户输入来搜索特定网站。我只有以下问题:

如果您查看项目TableSearch(类 MainViewController.m),您会注意到它会更新“filteredListContent”并重新加载 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

您可以想象,当我使用我的实现进行解析和搜索时,它需要一些内存,并且在用户键入时重复调用它以显示“实时结果”时尤其重要。当我只使用我的块的第一行进行解析和搜索(使用 URL 初始化 NSData 对象)时,SearchBar 开始滞后并在输入每个字符后延迟几秒钟。当我使用整个块时,应用程序崩溃。我的问题如下:

如何在执行搜索之前等待键盘上的“搜索”或“返回”按钮被点击,或者我可以在哪里以及如何检查按钮是否被点击?对于这个可能微不足道的问题,我们深表歉意。

【问题讨论】:

【参考方案1】:

让你的委托对象也成为搜索栏的委托,实现这些方法如下:

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

这将防止表格视图在用户键入或更改范围时重新加载,并在单击搜索按钮时重新加载。但是,当输入第一个字符时,表格会重新加载。我还没有找到阻止这种行为的方法。事实上,当输入第一个字符时,表格可能会显示没有结果。

【讨论】:

以上是关于带有 UISearchBar 和 UITableView 的 UISearchDisplayController - 如何避免“实时结果”?的主要内容,如果未能解决你的问题,请参考以下文章

带有 UISearchBar 和 UITableView 的 UISearchDisplayController - 如何避免“实时结果”?

带有范围栏的 UITableView 上的 UISearchBar 在其他 UI 项上调整自身大小

如何在带有标题视图和 UITableview 的自定义视图中正确设置 UISearchbar 的动画?

当 UIPopoverController 在屏幕上时,无法与带有 UIPopoverController 的 UISearchBar 进行交互

iOS:带有 UISearchdisplaycontroller 的 UISearchBar 通过单击搜索栏崩溃

UISearchBar 和 resignFirstResponder