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

iphone隐藏UISearchDisplayController结果?

在 UISearchDisplayController 中设置 UISearchBar 的边框颜色