UISearchDisplayController / ISearchResult TableView 在每个搜索中添加额外的行? IOS 7

Posted

技术标签:

【中文标题】UISearchDisplayController / ISearchResult TableView 在每个搜索中添加额外的行? IOS 7【英文标题】:UISearchDisplayController / UISearchResultsTableView Adding in Extra Line with Each Search ? iOS7 【发布时间】:2013-12-02 12:44:06 【问题描述】:

我有一个在 ios7 下表现异常的 UISearchDisplayController。第一次搜索,一切正常,UISearchResultsTableView 正确显示结果。

问题是我第二次进行搜索(关闭表格后),在搜索结果表格的顶部添加了一个空行(看起来像一个单元格):

随后每次搜索都会在表格顶部添加另一个空白行,依此类推。

代码如下:

//Setup the search bar.
searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0.0f, 0.0f, 360.0f, 44.0f)];
UIBarButtonItem * searchBarButton = [[UIBarButtonItem alloc] initWithCustomView:searchBar];
searchBar.delegate = self;
controller = [[UISearchDisplayController alloc]initWithSearchBar:self.searchBar contentsController:self];
controller.searchResultsDataSource = self;
controller.searchResultsDelegate = self;

self.tabBarController.navigationItem.rightBarButtonItems = @[searchBarButton];

- (void)searchBar:(UISearchBar *)theSearchBar textDidChange:(NSString *)searchText 
    if (isLoading) 
        return;
    

    [self filter : searchText];
    [controller.searchResultsTableView reloadData];



- (void)filter : (NSString *)text 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(name CONTAINS[cd] %@ OR number CONTAINS[cd] %@)", text, text];
    searchResults  = [standArray filteredArrayUsingPredicate:predicate];


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    return [searchResults count];


    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];

        if (cell == nil) 
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MyIdentifier"];
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
        

        if ([searchResults count] ==0) 
            cell.textLabel.text = @"";
        
        else 
            NSString * name = [[searchResults objectAtIndex:indexPath.row] name];
            NSString * number = [[searchResults objectAtIndex:indexPath.row] number];
            NSString * resultsString = [NSString stringWithFormat:@"%@ %@", name, number];
            cell.textLabel.text = resultsString;
        

        return cell;

    

    - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
        NSString * name = [[searchResults objectAtIndex:indexPath.row] name];
        Object * exhibitor = [self getExhibitorForStandName:standName];
        if ([exhibitor.companyName isEqualToString:standName]) 
            NSString * status = [[self getExhibitorForStandName:standName] status];
            cell.backgroundColor = [standColourMapping objectForKey:status];
        
    

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    
        [self.searchDisplayController setActive:NO animated:YES];

        ...
        
    

【问题讨论】:

我不认为这是解决方案,但是每次文本更改时都应该清空数组。在 textDidChange 你应该添加 [searchResults removeAllObjects]; - 并在第二次搜索时使用 NSLog 检查此数组索引 0 处的对象是什么 在 arc 下,这将在第一次文本更改时释放 searchResults 数组,然后在下一次更改时崩溃。 如果你这样做 [searchResults removeAllObjects];在 textDidChange 中,应用崩溃了?? 第二次更改文本是 - 因为 searchResults 已被释放。 removeAllObjects 不释放数组,只是清空数组。无论如何 NSLog 上 searchResults 打印到第二次搜索什么? 【参考方案1】:

好吧,对于未来的旅行者来说,这看起来像是一个奇怪的错误,即 UISearchBar 的高度每次出现时都会添加到 searchResultsTable 的顶部。

解决方法如下:

controller.searchResultsTableView.contentInset = UIEdgeInsetsMake(0.0f, 0.f, 0.f, 0.f); //Fix for weird weird iOS7 bug where each subsequent
    //search adds the height of the searchBar to the top of the searchResultsTableView.

【讨论】:

只将顶部插图设置为零就足够了。

以上是关于UISearchDisplayController / ISearchResult TableView 在每个搜索中添加额外的行? IOS 7的主要内容,如果未能解决你的问题,请参考以下文章

为啥 UISearchDisplayController 有时有效,有时无效?

iOS UISearchDisplayController学习笔记

在 UISearchDisplayController 上遇到僵尸问题

修复 UITableView 顶部的 UISearchdisplaycontroller 搜索栏

iphone隐藏UISearchDisplayController结果?

在 UISearchDisplayController 中设置 UISearchBar 的边框颜色