UISearchDisplayController不显示任何行

时间:2015-04-13 20:08:36

标签: ios objective-c uisearchbar uisearchdisplaycontroller

我正在尝试以编程方式将搜索栏添加到UITableViewController派生类(我没有xib)。当我点击搜索栏时,表格变为空白,并出现键盘。如果我键入搜索词,调试消息会告诉我过滤后的数组具有正确的条目数,但视图仍为空白。

我已将.h文件中的UISearchDisplayController声明为: @property(非原子,强)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 个答案:

答案 0 :(得分:0)

不推荐使用UISearchDisplayController,并将其替换为UISearchController。我建议您查看UICatalog,在那里您可以看到一些不错的示例代码,以更长期的可支持方式完成同样的事情。

https://developer.apple.com/library/ios/samplecode/UICatalog/Introduction/Intro.html