gpt4 book ai didi

ios - UISearchDisplayController 不更新搜索结果

转载 作者:行者123 更新时间:2023-11-28 22:03:17 26 4
gpt4 key购买 nike

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

- (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 委托(delegate)和 DataSource 在我的 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 结果是您的搜索结果 TableView ,那么尝试使用标识符使单元格出队将不起作用,因为它没有原型(prototype)单元格。因此,你必须使用 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

关于ios - UISearchDisplayController 不更新搜索结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24580078/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com