iPhone-UISearchDisplayController没有结果tableView?

通常,UISearchDisplayController激活后会使tableView变暗并聚焦searchBar。 只要在searchBar中输入文本,它就会创建一个searchResultsTableView,该结果显示在searchBar和键盘之间。 当第二个UITableView加载/显示/隐藏/卸载时,将调用searchDisplayController的委托。 通常,它会在键入时显示实时搜索结果或自动补全条目。

在我的应用程序中,我想搜索一个Web服务,并且不想为用户输入的每个字母调用该Web服务。 因此,我要完全禁用searchResultsTableView,并在他输入文本时保留黑色的灰色覆盖。 一旦他点击搜索按钮,我便会触发搜索(带有加载屏幕)。

仅返回searchResultsTableView的零行看起来并不好,因为它显示一个空的searchResultsTableView并显示“无结果”消息。 我尝试隐藏显示的表格(searchDisplayController:didLoadSearchResultsTableView:),该表格可以正常工作,但是黑色变暗的覆盖层也被隐藏了,因此基础tableView再次完全可见。

除了从头开始重新创建UISearchDisplayController功能,还有其他想法吗?

10个解决方案
38 votes

这是我刚想出的一个小把戏而且您在编辑搜索字符串时必须返回0个结果

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

我想你会弄清楚下一步该怎么做

user182820 answered 2020-08-12T05:17:23Z
19 votes

您是否尝试过:

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

这样,如果用户在1/5秒内键入另一个字符,则您只会拨打一个网络电话。

Raymond W answered 2020-08-12T05:17:48Z
9 votes

上面的内容似乎最终都无法正常工作,因此我想到了以下内容(准备好显示结果时必须调用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];
}

显然,它使表格透明,添加与表格大小相同的黑色/半透明表格标题,并禁止在表格上滚动,这样您就无法在表格上方或上方移动。 另外,您可以在标题视图中添加一些内容(“请稍候...”或活动指示器)。

Barry Haanstra answered 2020-08-12T05:18:14Z
9 votes

与您有相同的问题,我通过以下方法解决了这个问题:a)开始搜索时将searchResultsTableView的alpha设置为0,然后b)将viewView的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
cvursache answered 2020-08-12T05:18:47Z
2 votes

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

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

你尝试过这个吗?

xoconoxtle answered 2020-08-12T05:19:12Z
2 votes

基于user182820的代码,以下是我的版本。 我隐藏了UISearchDisplayController的表格视图。 当在搜索框中输入一个字符时,我放置了一个“变暗的视图”,因此它看起来像UISearchDisplayController的“变暗的视图”从未消失,然后在搜索完成后将其删除。 如果输入一些字符并按“取消”,则表视图会短暂变为全白,并且我不知道该如何解决。

- (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;
}   
Mark Horgan answered 2020-08-12T05:19:32Z
2 votes

这样简单就可以了:

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

对我来说很好。

ingenspor answered 2020-08-12T05:19:57Z
1 votes

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

- (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 ....
}
answered 2020-08-12T05:20:17Z
1 votes

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

-(void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView
{
    tableView.hidden = YES;
}
Chris Allwein answered 2020-08-12T05:20:38Z
0 votes

我想我找到了一个更好的解决方案。 先前的所有答案正确地显示了与搜索之前的UITableView外观相同的变暗视图,但是每种解决方案都缺少点按该区域以取消搜索的功能。

因此,我认为这段代码效果更好。

首先,创建一个BOOL(例如searchButtonTapped)以指示是否点击了搜索按钮。 默认情况下为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;
}

根据其他答案,现在应该很清楚了。 当用户点击“搜索”按钮时,请确保还恢复原始设置。

此外,在cellForIndexPath方法中添加:

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

为了创建在输入文本之前显示的相同的变暗视图。 确保将这些属性应用于正确的单元格,即,检查哪个UITableView是活动的,并且用户未轻按“搜索”按钮。

然后,至关重要的是,在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的可见选择,而是取消搜索。

Willem Sleegers answered 2020-08-12T05:21:34Z
translate from https://stackoverflow.com:/questions/1214185/uisearchdisplaycontroller-with-no-results-tableview