6

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

4

2 回答 2

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;
}

希望这可以帮助。

于 2013-10-08T14:02:21.513 回答
7

(我在UISearchBar \ UISearchDisplayViewController的麻烦中发布了同样的答案,这似乎是这个问题的重复。)

我遇到了同样的问题,并注意到它searchDisplayControllerDidEndSearch被调用了两次。第一次,superviewself.searchDisplayController.searchBarUITableView,第二次仍然是 a 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作为它的子项返回。

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

于 2014-06-16T23:22:45.783 回答