如何让UISearchBar的范围栏始终可见?

7
这是我在iPhone SDK上遇到的最新问题。
我已经设置好了UISearchBar和它的代理。此外,当我加载我的视图时,我调用:
self.searchDisplayController.searchBar.showsScopeBar = YES;

那样,当我的视图首次呈现时,我会看到预期的范围栏。 但是,如果在搜索栏内部触摸然后在外部(甚至在执行搜索然后取消搜索时),范围栏将再次隐藏。
所以我的问题是:是否可能始终显示范围栏?即使执行搜索后也是如此?
非常感谢。
2个回答

10

UISearchDisplayController会自动隐藏范围条。

解决方法是子类化UISearchBar并覆盖setShowsScopeBar:的实现:

@interface MySearchBar : UISearchBar {

}

@end

@implementation MySearchBar

- (void) setShowsScopeBar:(BOOL) show
{
    [super setShowsScopeBar: YES]; // always show!
}

@end

然后,在Interface Builder中,更改你的视图中(与UISearchDisplayController相关联的)搜索栏的类别为新的类别——在此示例中为MySearchBar。


你可能认为UISearchDisplayDelegate中的某个方法允许你重写范围栏的隐藏,但我尝试过的所有方法都无效。子类化UISearchBar可以解决这个问题。 - dodgio
6
在iOS7中,当点击搜索栏后又取消搜索时,这种方法起初是有效的,但范围条将随之隐藏。我无法找到在iOS7中编写代码以重新显示UISearchDisplayDelegate隐藏的范围条的方法。你知道有什么方法吗? - msec

0
我知道这是老问题了,但如果还有人在这里寻找答案,这个方法对我来说在iOS 16上有效。诀窍似乎是先将其设置为false(?)。
extension MyViewController: UISearchControllerDelegate {
    func didPresentSearchController(_ searchController: UISearchController) {
        searchController.searchBar.showsScopeBar = false
        searchController.searchBar.setShowsScope(true, animated: false)
    }

    func didDismissSearchController(_ searchController: UISearchController) {
        searchController.searchBar.showsScopeBar = false
        searchController.searchBar.setShowsScope(true, animated: false)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接