UISearchDisplayController 不显示任何行
Posted
技术标签:
【中文标题】UISearchDisplayController 不显示任何行【英文标题】:UISearchDisplayController not displaying any rows 【发布时间】:2015-04-13 20:08:36 【问题描述】:我正在尝试以编程方式将搜索栏添加到 UITableViewController 派生类(我没有 xib)。当我点击搜索栏时,表格变为空白,并出现键盘。如果我键入搜索词,调试消息会告诉我过滤后的数组具有正确的条目数,但视图仍然为空白。
我已将 .h 文件中的 UISearchDisplayController 声明为: @property (nonatomic, strong) UISearchDisplayController *searchController; 另外,我在类 def 中添加了 UISearchDisplayDelegate 和 UISearchBarDelegate。
我在 viewDidLoad 中创建了 uisearchbar 和 UISearchDisplayController 如下:
UISearchBar *theSearchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
[theSearchBar sizeToFit];
theSearchBar.delegate = self;
theSearchBar.autocorrectionType = UITextAutocorrectionTypeNo;
self.tableView.tableHeaderView = theSearchBar;
self.searchController = [[UISearchDisplayController alloc]
initWithSearchBar:theSearchBar
contentsController:self];
self.searchController.delegate = self;
self.searchController.searchResultsDataSource = self;
self.searchController.searchResultsDelegate = self;
//etc.;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
if (tableView == self.searchController.searchResultsTableView)
rows = self.filteredPersons.count;
else
rows = [(NSSet *)[self.cardList valueForKey:@"cards"] count];
return rows;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
FLOG(@" called");
UILabel *nameLabel = nil;
bool filtering = NO;
static NSString *CellIdentifier = @"PersonCell";
MGSwipeTableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[MGSwipeTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
NSArray *subviews = [[NSArray alloc] initWithArray:cell.contentView.subviews];
for (UIView *subview in subviews)
[subview removeFromSuperview];
[cell setBackgroundColor:[UIColor clearColor]];
NSInteger count = 0;
Person *person;
if (tableView == self.searchController.searchResultsTableView )
person = [self.filteredPersons objectAtIndex:indexPath.row];
else
person = [[self sortPersons] objectAtIndex:indexPath.row];
...
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
if (searchString.length==0)
self.filteredPersons = [[NSMutableArray alloc] init];
return NO;
[self.filteredPersons removeAllObjects];
if (searchString.length>0)
for (Person *person in self.sortPersons)
NSRange range = [person.compositeName rangeOfString:searchString options:NSCaseInsensitiveSearch];
if (range.location != NSNotFound)
[self.filteredPersons addObject:person];
NSLog (@" Filtered persons now %d", self.filteredPersons.count);
return YES;
当我用一个有 4 行的表格进行测试时,如果我点击搜索栏,键盘会出现,但表格完全空白。另一件不正确的事情是,调试消息显示 numberOfRowsInSection 在说有 4 行和 0 行之间交替调用了几次! 当我开始输入时, shouldReloadTableForSearchString 确实被调用,并且似乎将正确的行数添加到过滤后的数组中(我正在运行的测试中有两个)。 使用调试消息,我可以看到 cellForRowAtIndexPath 被调用了两次,并在我的过滤列表中找到了正确的名称,但表格仍然是空白的。此外,numberOfRowsInSection 被调用了几次,有时说有 2 行,有时是 4 行。
请有人给我一些关于我做错了什么的想法,或者如何调试它。
【问题讨论】:
【参考方案1】:UISearchDisplayController 已弃用并由 UISearchController 取代。我建议您查看 UICatalog,您可以在其中看到一些不错的示例代码,以更长期可支持的方式完成同样的事情。
https://developer.apple.com/library/ios/samplecode/UICatalog/Introduction/Intro.html
【讨论】:
以上是关于UISearchDisplayController 不显示任何行的主要内容,如果未能解决你的问题,请参考以下文章
为啥 UISearchDisplayController 有时有效,有时无效?
iOS UISearchDisplayController学习笔记
在 UISearchDisplayController 上遇到僵尸问题
修复 UITableView 顶部的 UISearchdisplaycontroller 搜索栏