Ios7 在iOS 7上使用搜索委托双击UISearchBar会导致UISearchBar消失

Ios7 在iOS 7上使用搜索委托双击UISearchBar会导致UISearchBar消失,ios7,uisearchbar,uisearchbardelegate,uisearchbardisplaycontrol,Ios7,Uisearchbar,Uisearchbardelegate,Uisearchbardisplaycontrol,我们在表头有一个搜索栏。当用户在iOS 7上快速点击它两次时,它就会消失。有人对我们做错了什么有什么建议吗?经过大量的尝试和错误,我发现当searchDisplayController结束搜索时,搜索栏消失了,所以我将搜索栏重新插入到了表头,它对我起到了作用 - (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller { self.searchingFetchedResultsCo

我们在表头有一个搜索栏。当用户在iOS 7上快速点击它两次时,它就会消失。有人对我们做错了什么有什么建议吗?

经过大量的尝试和错误,我发现当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;
}
希望这能有所帮助。

(我把同样的答案贴到了,这似乎是这个问题的重复。)

我遇到了同样的问题,并注意到
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
被解除时,superview会被设置回它以前的
UITableView
,除非它解除得太快,以至于从未正确初始化过,在这种情况下,它会不正确地清理,并且
UITableView
永远不会将
UISearchBar
作为它的子级


这个解决方案仍然不理想,我认为苹果在自己的应用程序中一定做了一些不同的事情,因为他们的搜索栏用户体验更好一些。我认为最好在
UISearchBar
准备好之前不要处理第二次点击。我尝试使用其他
UISearchBarDelegate
方法来执行此操作,但找不到合适的钩子来覆盖当前行为。

是否在导航栏下?我有一些意见和作品的搜索栏很好。我也得到了同样的问题。我已尝试从代码中删除以下行。self.edgesForExtendedLayout=UIRectEdgeNone;self.navigationController.navigationBar.translucent=否;它解决了这个问题。但是UI会受到干扰。我也遇到了同样的错误。谢谢Priya,这看起来基本上是有效的:-(void)SearchDisplayControllerDendSearch:(UISearchDisplayController*)控制器{if(是IOS7_还是更大){[self.tableView insertSubview:self.searchDisplayController.searchBar subview:self.tableView];}令人惊讶的是,它真的有帮助,不管这个解决方案有多脏,我真的不喜欢我也必须使用它。当用户再次点击已经动画化的搜索视图时,问题就出现了,另一个点击被searchDisplayController的空结果表接收,导致它立即关闭。我自己也遇到了这个错误。如果您检查
window
是否为零,该怎么办?这样,您就知道它不在视图层次结构中,并且不必硬编码相等性检查。