如何覆盖UISearchDisplayController searchResult TableView中的“无结果”文本?

时间:2012-07-24 21:02:26

标签: iphone cocoa-touch uisearchdisplaycontroller

我的服务器正在处理搜索查询时,我不想显示“无结果”文本。

enter image description here

我想出了包含标签的表格单元格的确切坐标,并试图覆盖它。

self.noResultsCoverView = [[[UIView alloc] initWithFrame:CGRectMake(
    0.0, 
    44.0, 
    320.0, 
    43.0
)] autorelease];
self.noResultsCoverView.backgroundColor = [UIColor whiteColor];
[self.searchDisplayController.searchResultsTableView addSubview:self.noResultsCoverView];

令我懊恼的是,我的封面位于桌面视图上方,但位于标签下方。我需要盖子在标签上方。 searchResultsTableView::bringSubviewToFront无效,这让我相信该标签根本不是searchResultsTableView的孩子。

顺便说一句,这个Stack Overflow answer对我来说并不适用。它适用于第一次搜索,但在后续搜索中闪烁一个奇怪的黑色封面。

4 个答案:

答案 0 :(得分:20)

这应该可以正常工作。返回至少一个单元格的代码:

BOOL ivarNoResults; // put this somewhere in @interface or at top of @implementation
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        if (filteredList.count == 0) {
            ivarNoResults = YES;
            return 1;
        } else {
            ivarNoResults = NO;
            return [filteredList count];
        }
    }
    // {…}
    // return the unfiltered array count
}

并且“显示”干净的细胞:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if (tableView == self.searchDisplayController.searchResultsTableView && ivarNoResults) {
        static NSString *cleanCellIdent = @"cleanCell";
        UITableViewCell *ccell = [tableView dequeueReusableCellWithIdentifier:cleanCellIdent];
        if (ccell == nil) {
            ccell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cleanCellIdent] autorelease];
            ccell.userInteractionEnabled = NO;
        }
        return ccell;
    }

    // {…}
}

答案 1 :(得分:6)

解决此问题的最简单方法是在查询正在进行时在numberOfRowsInSection中返回1并将虚拟单元格保留为空或将其隐藏属性设置为YES以使其不可见。

答案 2 :(得分:3)

试试这个对我有用

在UISearchDisplayController委托中执行以下操作:=

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.001);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        for (UIView* v in self.searchDisplayController.searchResultsTableView.subviews) {
            if ([v isKindOfClass: [UILabel class]] && 
                [[(UILabel*)v text] isEqualToString:@"No Results"]) {
                [(UILabel*)v setText:@""];
                break;
            }
        }
    });
    return YES;
}

答案 3 :(得分:1)

您需要意识到当您拥有UISearchDisplayController并且搜索栏处于活动状态时,传递到UITableView数据源和委托方法的UITableView参数实际上并非您的tableView对象,但是由UISearchDisplayController管理的tableView,用于显示“实时”搜索结果(例如,可能从主数据源过滤掉的结果)。

您可以在代码中轻松检测到这一点,然后从委托/数据源方法返回相应的结果,具体取决于tableView对象所询问的内容。

例如:

- (NSInteger)tableView:(UITableView *)tv numberOfRowsInSection:(NSInteger)section
{
    if (tv == self.searchDisplayController.searchResultsTableView) {
        // return the number of rows in section for the visible search results.
        // return a non-zero value to suppress "No results"
    } else {
        // return the number of rows in section for your main data source
    }
}

关键是您的数据源和委托方法正在为两个表提供服务,您可以(并且应该)检查哪个表要求数据或委派。

顺便说一句,“没有结果”是(我相信)由背景图像提供的,UISearchDisplayController当代表说没有行时显示...你没有看到2行表,第一个空白和第二个文本“无结果”。至少,这就是我认为在那里发生的事情。