在iOS 7上双击带有搜索委托的UISearchBar会导致UISearchBar消失

Jas*_*ker 6 uisearchbar uisearchbardelegate uisearchbardisplaycontrol ios7

我们在表格标题中有一个搜索栏.当用户在iOS 7上快速点击两次时,它会消失.有没有人有任何建议我们做错了什么?

小智 9

经过大量的试验和错误后,我发现当searchDisplayController结束搜索时,搜索栏就会消失,所以我将搜索栏重新插入表头,这对我有用.

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller
{
    self.searchingFetchedResultsController = nil;
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        [self.tableView insertSubview:self.searchDisplayController.searchBar aboveSubview:self.tableView];
    }
    return;
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


小智 7

(我用UISearchBar\UISearchDisplayViewController发布了与Troubles相同的答案,这看起来像是这个问题的副本.)

我遇到了同样的问题,并注意到它searchDisplayControllerDidEndSearch被调用了两次.第一次,超级视图self.searchDisplayController.searchBarUITableView,第二次它仍然是UIView.

有了Priya的答案,我担心每次搜索栏被双击时重新插入子视图会产生意外后果或不必要的开销,我也担心它会破坏未来的iOS版本.幸运的是,我们可以利用这样的superview奇怪:

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
    if (self.tableView != self.searchDisplayController.searchBar.superview) {
        [self.tableView insertSubview:self.searchDisplayController.searchBar aboveSubview:self.tableView];
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我不得不猜测发生了什么,当它处于活动状态时,UISearchBar会自动创建一个临时UIView的超级视图 - 这是执行搜索时看到的视图.当UISearchBar被解雇时,超级视图UITableView已经恢复原状,除非它被如此迅速地解雇,以至于它从未被正确初始化,在这种情况下它会不正确地清理并且UITableView永远不会UISearchBar像其孩子那样得到回报.

这个解决方案仍然不理想,我认为Apple必须在自己的应用程序中做一些不同的事情,因为他们的搜索栏UX感觉好一点.我认为最好不要在UISearchBar准备好之前先处理第二个水龙头.我尝试使用其他UISearchBarDelegate方法来执行此操作,但我找不到合适的挂钩来覆盖当前行为.