我已经使用 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 开始滞后并在输入每个字符后延迟几秒钟。当我使用整个块时,应用程序崩溃。我的问题如下:
如何在执行搜索之前等待键盘上的“搜索”或“返回”按钮被点击,或者我在哪里以及如何检查按钮是否被点击?对不起这个可能微不足道的问题。