UISearchDisplayController不更新搜索结果



我有以下搜索设置在我的应用程序:

- (UISearchBar*)searchBar
{
    if (!_searchBar) {
        _searchBar = [[UISearchBar alloc] init];
        _searchBar.delegate = self;
        _searchBar.placeholder = kSearchBarPlaceHolder;
    }
    return _searchBar;
}
- (UISearchDisplayController*)searchBarDisplayContr
{
    if (!_searchBarDisplayContr) {
        _searchBarDisplayContr = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self];
        _searchBarDisplayContr.delegate = self;
        _searchBarDisplayContr.searchResultsDataSource = self.tableView.dataSource;
        _searchBarDisplayContr.searchResultsDelegate = self.tableView.delegate;
        _searchBarDisplayContr.searchResultsTableView.backgroundColor = [UIColor clearColor];
        _searchBarDisplayContr.searchResultsTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    }
    return _searchBarDisplayContr;
}
- (NSMutableArray *)searchResults
{
    if (!_searchResults) {
        _searchResults = [NSMutableArray arrayWithCapacity:_restaurants.count];
    }
    return _searchResults;
}
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    [self.searchResults removeAllObjects];
    [self.restaurants enumerateObjectsUsingBlock:^(Restaurant *restaurant, NSUInteger idx, BOOL *stop) {
        if ([scope isEqualToString:@"All"] || [restaurant.name isEqualToString:scope]) {
            NSRange range = [restaurant.name rangeOfString:searchText
                                                   options:(NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch)];

            if (range.length > 0) {
                [self.searchResults addObject:restaurant];
            }
       }
    }];

}
- (BOOL)searchDisplayController:(UISearchDisplayController*)controller shouldReloadTableForSearchString:(NSString*)searchString
{
    [self filterContentForSearchText:searchString
                               scope:@"All"];

    dispatch_async(dispatch_get_main_queue(), ^(void) {
        for (UIView *v in controller.searchResultsTableView.subviews) {
            if ([v isKindOfClass:[UILabel class]]) {
                ((UILabel *)v).text = kSearchResultsTableViewNoResultsLabel;
                ((UILabel *)v).font = [UIFont mediumFontOfSize:20.0f];
                ((UILabel *)v).textColor = [UIColor blackColor];
                break;
            }
        }
    });

    return YES;
}

- (BOOL)searchDisplayController:(UISearchDisplayController*)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
{
    [self filterContentForSearchText:[self.searchBarDisplayContr.searchBar text]
                               scope:@"All"];
    return YES;
}

但出于某种原因,当我搜索searchResultsTableView不更新/cellForRowAtIndexPath不调用。tableView委托和数据源是在storyboard中设置的。

知道为什么会这样吗?

更新:

 [self.tableView registerClass:[RestaurantsCell class] forCellReuseIdentifier:cellIdentifier];
    [self.searchBarDisplayContr.searchResultsTableView registerClass:[RestaurantsCell class] forCellReuseIdentifier:cellIdentifier];

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
    if (tableView == self.searchBarDisplayContr.searchResultsTableView) {
        return [self.searchResults count];
    } else {       
           return [self.restaurants count];

    }
    return 0;
}
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    RestaurantsCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    Restaurant *restaurant;
    if (tableView == self.searchBarDisplayContr.searchResultsTableView) {
        if (self.searchResults.count > 0) {
            restaurant = self.searchResults[indexPath.row];

        }

    } else {   
 if (self.restaurants.count > 0) {     
          restaurant = self.restaurants[indexPath.row];
}
    }

    if (restaurant) {
        cell.titleLabel.text = restaurant.name;
    }
    return cell;
}

这是违规行:

RestaurantsCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
应:

RestaurantsCell *cell = [self.tableView dequeueReusableCellWithIdentifier:cellIdentifier];

解释:

如果tableView原来是你的搜索结果表视图,然后试图去排队一个单元格与一个标识符不会工作,因为它没有原型单元格。因此,您必须使用self.tableView

同样,你的代码可以被清理很多:

- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
    return (tableView == self.tableView) ? self.restaurants.count : self.searchResults.count;
}
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    RestaurantsCell *cell = [self.tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    Restaurant *restaurant = (tableView == self.tableView) ? self.restaurants[indexPath.row] ? self.searchResults[indexPath.row];
    }
    cell.titleLabel.text = restaurant.name;
    return cell;
}

编辑看看这个例子

最新更新