UISearchDisplayController的searchResultsTableView的ContentSize不正确。 iOS 7中的错误?

时间:2013-09-28 17:07:09

标签: ios ios6 ios7 uisearchdisplaycontroller uisearchresultscontroller

以下问题仅发生在iOS 7.0+设备上运行的iOS 6.0 / 6.1应用程序中。

所以我有一个UISearchDisplayController来搜索我们的API并返回数据。这一切都有效,一切都按我们的意愿显示。我们看到的唯一问题是,在内容填充searchResultsTableView之后,似乎最初隐藏键盘时,contentSize的{​​{1}}比数据大得多,实际上似乎是键盘的大小。当我进入搜索栏并显示键盘并再次点击“搜索”(只是为了隐藏键盘)时,searchResultsTableView然后正确调整以仅填充屏幕,仅此而已。下面是我正在谈论的最初contentSize人口的屏幕截图。

白色是表格数据,灰色/奶油色是额外的tableView空间。

有关如何解决此问题的任何想法?

2 个答案:

答案 0 :(得分:62)

我遇到了这个问题。发布在论坛here上的解决方案为我工作。不确定这是iOS 7中的错误,还是他们改变了他们做事的方式,但这是我找到解决问题的唯一解决方案。

来自论坛帖子的懒人解决方案:

- (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView {

    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];

}



- (void)searchDisplayController:(UISearchDisplayController *)controller willShowSearchResultsTableView:(UITableView *)tableView {

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide) name:UIKeyboardWillHideNotification object:nil];

}



- (void) keyboardWillHide {

    UITableView *tableView = [[self searchDisplayController] searchResultsTableView];

    [tableView setContentInset:UIEdgeInsetsZero];

    [tableView setScrollIndicatorInsets:UIEdgeInsetsZero];

}

答案 1 :(得分:8)

这个系统错误仍然存​​在于iOS 8中,并且接受答案的解决方案不再适用。因此,您应该使用以下解决方案:

-(void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}

-(void)searchDisplayController:(UISearchDisplayController *)controller willShowSearchResultsTableView:(UITableView *)tableView {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}

-(void)keyboardWillHide:(NSNotification*)notification {
    CGFloat height = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;
    UITableView *tableView = [[self searchDisplayController] searchResultsTableView];
    UIEdgeInsets inset;
    [[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0 ? (inset = UIEdgeInsetsMake(0, 0, height, 0)) : (inset = UIEdgeInsetsZero);
    [tableView setContentInset:inset];
    [tableView setScrollIndicatorInsets:inset];
}