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

时间:2013-10-07 19:09:48

标签: ios7 uisearchbar uisearchbardelegate uisearchbardisplaycontrol

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

2 个答案:

答案 0 :(得分: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;
}

希望这有帮助。

答案 1 :(得分:7)

(我将同样的答案发布到Troubles with UISearchBar \ UISearchDisplayViewController,这似乎是这个问题的重复。)

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

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

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

如果我不得不猜测发生了什么,UISearchBar会自动创建一个临时的UIView作为其超级视图,当它处于活动状态时 - 这是执行搜索时看到的视图。当UISearchBar被解雇时,超级视图被重新设置为之前的UITableView除非它被如此快速地解散,以至于它从未被正确初始化,其中如果它不正确地清理,UITableView永远不会像其孩子那样得到UISearchBar

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