UISearchDisplayController不会更新搜索结果

时间:2014-07-04 19:42:28

标签: ios objective-c uisearchbar 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委托和DataSource在我的故事板中设置。

为什么会发生这种情况?

更新:

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

1 个答案:

答案 0 :(得分:2)

这是违规行:

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

修改 查看this example