如何防止UISearchController显示导航栏?

时间:2018-07-13 21:59:11

标签: ios objective-c uisearchbar uisearchcontroller

我的用例有点奇怪。我使用的是自己的导航栏,所以我用

隐藏了默认的导航栏。
[self.navigationController setNavigationBarHidden:YES animated:NO];

viewWillAppear上。

一切正常,但是如果我在主动搜索中打开键盘,然后回到上一个UIViewController,则本机导航栏会再次显示,最后我会得到2个导航栏(我自己的和默认的)。

这就是我在UISearchController中设置viewDidLoad的方式:

- (void)viewDidLoad {
[super viewDidLoad];
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchResultsUpdater = self;
self.searchController.obscuresBackgroundDuringPresentation = NO;
self.searchController.searchBar.delegate = self;
[self.searchController.searchBar sizeToFit];
self.definesPresentationContext = YES;
self.searchController.hidesNavigationBarDuringPresentation = YES;
self.searchController.searchBar.searchBarStyle = UISearchBarStyleMinimal;
}

我已经尝试删除self.definesPresentationContext = YES;(或将其设为NO),但这会产生一个不同的问题,那就是当我返回上一个UIViewController时,搜索栏位于其他一切!直到我点击“取消”。我还尝试过通过编程方式在viewWillDissappear上调用“取消”按钮,但是那也不起作用...

所以我用完了所有选项,这就是为什么我在这里。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

使用非标准的导航栏可能不是最好的主意。 (我知道客户有时会固执,但是我们应该告诉他们,有时候标准的解决方案有很多好处,例如维护成本低,从而为他们节省了费用。)

话虽如此,作为最后的手段,我可​​能会建议您采取一种非常“强有力”的方法。 您可以使用自定义类对UINavigationController进行子类化,并且可以在此类内部重写setNavigationBarHidden方法,例如

- (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated{
     [super setNavigationBarHidden:YES animated:NO];
}

方法。这应该使栏始终隐藏。 不过,我对这种解决方案的支持不大,但可能适合您的情况。