UISearchDisplayController没有结果tableView?

通常情况下,一个UISearchDisplayController被激活后,会调暗tableView并关注searchBar。 只要在searchBar中input文本,它就会在searchBar和键盘之间创build一个searchResultsTableView。 当第二个UITableView被加载/显示/隐藏/卸载时,searchDisplayController的委托被调用。 通常它会在打字时显示实时search结果或自动完成条目。

在我的应用程序中,我想search一个web服务,我不想为用户input的每个字母调用web服务。 因此,我想完全禁用searchResultsTableView,并在input文本时保留变暗的黑色叠加层。 一旦他点击searchbutton,我会触发search(加载屏幕)。

只是返回零行searchResultsTableView看起来不太好,因为它显示一个空的searchResultsTableView与“没有结果”消息。 我试图隐藏表( searchDisplayController:didLoadSearchResultsTableView:哪些工作,但黑色暗灰色叠加也隐藏,使底层tableView是完全可见的。

任何想法,除了重新创buildUISearchDisplayControllerfunction?

这里有一个小技巧,我只是想出来,你也必须返回0结果,而编辑searchstring

 - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { savedSearchTerm = searchString; [controller.searchResultsTableView setBackgroundColor:[UIColor colorWithWhite:0.0 alpha:0.8]]; [controller.searchResultsTableView setRowHeight:800]; [controller.searchResultsTableView setScrollEnabled:NO]; return NO; } - (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView { // undo the changes above to prevent artefacts reported below by mclin } 

我想你会找出下一步该怎么做

你有没有试过这个:

 [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(_lookup:) object:nil]; [self performSelector:@selector(_lookup:) withObject:txt afterDelay:0.20]; 

这样,如果用户在1/5秒内键入另一个字符,则只能进行一次networking通话。

上述内容似乎没有什么效果,所以我想出了以下内容(当您准备好显示结果时,您必须调用removeTableHeader):

 - (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar { [self setTableHeader]; } - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { [self setTableHeader]; } - (void)setTableHeader { UIView *headerView = [[UIView alloc] initWithFrame:self.searchDisplayController.searchResultsTableView.frame]; headerView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.8]; [self.searchDisplayController.searchResultsTableView setBackgroundColor:[UIColor clearColor]]; [self.searchDisplayController.searchResultsTableView setScrollEnabled:NO]; [self.searchDisplayController.searchResultsTableView setTableHeaderView:headerView]; [headerView release]; } - (void)removeTableHeader { [self.searchDisplayController.searchResultsTableView setBackgroundColor:[UIColor whiteColor]]; [self.searchDisplayController.searchResultsTableView setScrollEnabled:YES]; [self.searchDisplayController.searchResultsTableView setTableHeaderView:nil]; } 

显然,它使表格变得透明,增加了一个与表格大小相同的黑色/半透明的表格标题,并且禁用了表格的滚动操作,所以你不能在表格之上或者之后通过。 作为奖励,你可以添加一些东西到标题视图(“请稍等…”或活动指标)。

如果你有同样的问题,我通过以下方式处理它: a)开始search时,将searchResultsTableView的alpha设置为0,然后通过b)向viewController的视图添加/删除overlayView。 对我来说就像一个魅力。

 @interface MyViewController() //... @property(nonatomic, retain) UIView *overlayView; //... @end @implementation MyViewController @synthesize overlayView = _overlayView; //... - (void)viewDidLoad { //... //define your overlayView _overlayView = [[UIView alloc] initWithFrame:CGRectMake(0, 44, 320, 480)]; _overlayView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.8]; } //hide the searchResultsTableView - (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller { self.searchDisplayController.searchResultsTableView.alpha = 0.0f; } //when ending the search, hide the overlayView - (void) searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller { [_overlayView removeFromSuperview]; } //depending on what the user has inputed, add or remove the overlayView to the view of the current viewController - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { if ([searchString length]>0) { [self.view addSubview:_overlayView]; } else { [_overlayView removeFromSuperview]; } return NO; } @end 

在你的UISearchDisplayDelegate(通常是你自定义的UITableViewController子类)中实现以下方法应该足够了,

 - (BOOL) searchDisplayController: (UISearchDisplayController *) controller shouldReloadTableForSearchString: (NSString *) searchString { [self startMyCustomWebserviceSearchAsBackgroundProcessForString: searchString]; //starts new NSThread return NO; } 

你有尝试过吗?

基于user182820的代​​码是我的版本。 我隐藏了UISearchDisplayController的表视图。 当在search框中input一个字符时,我会放置一个'dimmed view',所以看起来像UISearchDisplayController的'dimmed view'永远不会消失,然后在search结束时将其删除。 如果你input一些字符,然后按取消,表格视图短暂地全白,我不知道如何解决这个问题。

 - (void)viewDidLoad { ... tableViewMask=[UIView new]; tableViewMask.backgroundColor = [UIColor blackColor]; tableViewMask.alpha = 0.8; } - (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller{ tableViewMask.frame=CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y+controller.searchBar.frame.size.height, self.tableView.frame.size.width, self.tableView.frame.size.height-controller.searchBar.frame.size.height); controller.searchResultsTableView.hidden=YES; } - (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller{ [tableViewMask removeFromSuperview]; } - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{ if (searchString.length==0) [tableViewMask removeFromSuperview]; else [self.tableView addSubview:tableViewMask]; [searchText autorelease]; searchText=[searchString retain]; return NO; } 

怎么做就这么简单:

 - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { self.searchDisplayController.searchResultsTableView.hidden=YES; return YES; } 

为我工作正常..

我更好的方法,因为有一个“最佳答案”的错误 – 滚动黑色背景表时将显示分隔符和“无结果”。

 - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { controller.searchResultsTableView.backgroundColor = [UIColor blackColor]; controller.searchResultsTableView.alpha = 0.8; controller.searchResultsTableView.separatorStyle = UITableViewCellSeparatorStyleNone; for(UIView *subview in tableView.subviews) { if([subview isKindOfClass:UILabel.class]) { subview.hidden = YES; } } return NO; } - (void) searchBarSearchButtonClicked:(UISearchBar *)searchBar { self.searchDisplayController.searchResultsTableView.backgroundColor = [UIColor whiteColor]; self.searchDisplayController.searchResultsTableView.alpha = 1; self.searchDisplayController.searchResultsTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; for(UIView *subview in tableView.subviews) { if([subview isKindOfClass:UILabel.class]) { subview.hidden = NO; } } // search results and reload data .... } 

所有现有的答案都过于复杂。 您可以立即隐藏结果表视图。

 -(void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView { tableView.hidden = YES; } 

我想我find了一个更好的实现这个问题。 所有以前的答案都正确地显示了与search前UITableView相似的灰色视图,但是每个解决scheme都缺less点击该区域以取消search的function。

出于这个原因,我认为这个代码效果更好。

首先,创build一个BOOL,如searchButtonTapped来指示searchbutton是否被点击。 默认情况下是NO。

然后:

 - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { if (!searchButtonTapped) { // To prevent results from being shown and to show an identical look to how the tableview looks before a search [controller.searchResultsTableView setBackgroundColor:[UIColor clearColor]]; [controller.searchResultsTableView setRowHeight:160]; self.searchDisplayController.searchResultsTableView.scrollEnabled = NO; } else { // Restore original settings [controller.searchResultsTableView setBackgroundColor:[UIColor whiteColor]]; [controller.searchResultsTableView setRowHeight:44]; self.searchDisplayController.searchResultsTableView.scrollEnabled = YES; } return YES; } 

基于其他答案,现在应该清楚了。 当用户点击searchbutton时,请确保还原原始设置。

此外,在cellForIndexPath方法中添加:

 cell.selectionStyle = UITableViewCellSelectionStyleNone; cell.contentView.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.8]; 

为了创buildinput文本之前显示的相同的灰色视图。 确保将这些属性应用到正确的单元格,即检查哪个UITableView处于活动状态,并且用户没有点击searchbutton。

然后,关键的是,在didSelectRowAtIndexPath中:

 if (tableView == self.searchDisplayController.searchResultsTableView) { if (searchButtonTapped) { // Code for when the user select a row after actually having performed a search { else [self.searchDisplayController setActive:NO animated:YES]; 

现在用户可以点击模糊的区域,这不会导致可见的UITableViewCell的select,而是取消search。