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 搜索栏