5

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

在此处输入图像描述

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

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没用,这让我相信这个标签根本不是 the 的孩子searchResultsTableView

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

4

4 回答 4

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

    // {…}
}
于 2012-08-02T08:39:10.093 回答
6

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

于 2012-07-27T18:52:05.740 回答
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;
}
于 2012-07-30T05:29:27.587 回答
1

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

您可以在代码中轻松检测到这一点,然后根据请求的 tableView 对象从委托/数据源方法返回适当的结果。

例如:

- (NSInteger)tableView:(UITableView *)tv numberOfRowsInSection:(NSInteger)section
{
    if (tv == self.searchDisplayController.searchResultsTableView) {
        // 返回可见搜索结果部分中的行数。
        // 返回一个非零值以抑制“无结果”
    } 别的 {
        // 返回主数据源的节中的行数
    }
}

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

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

于 2012-07-27T19:53:29.340 回答