搜索处于活动状态时导航栏问题并推送到下一个视图控制器
Navigation bar issue when search is active and push to next view controller
我遇到了导航栏问题。我在 navigationItem 的搜索控制器中添加 searchController
。
查看下面的图片link:
navigation bar issue
步骤:
1) 我在 table 视图中有数据,当我单击单元格时,它会打开带有自定义导航视图的详细信息屏幕。这工作正常。 (默认导航栏隐藏)
2) 现在,我点击了搜索栏,然后点击了 table 查看单元格。它向我展示了详细信息屏幕的默认导航栏。我不想显示默认导航栏。
我写的实现搜索控制器的代码如下:
searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.obscuresBackgroundDuringPresentation = false
searchController.searchBar.placeholder = "Search here..."
searchController.searchBar.tintColor = .white
searchController.searchBar.barTintColor = .white
if let textfield = searchController.searchBar.value(forKey: "searchField") as? UITextField {
textfield.textColor = UIColor.blue
if let backgroundview = textfield.subviews.first {
// Background color
backgroundview.backgroundColor = UIColor.white
// Rounded corner
backgroundview.layer.cornerRadius = 10;
backgroundview.clipsToBounds = true;
}
}
self.navigationItem.searchController = self.searchController
definesPresentationContext = true
下面是在 didSelect 方法中隐藏导航栏的代码:
self.navigationController?.navigationBar.isHidden = true
self.navigationController?.isNavigationBarHidden = true
您可以通过使搜索控制器处于非活动状态来解决此问题,然后在延迟一段时间后导航到您的详细信息视图控制器。
在您的 didSelect
方法中尝试以下代码,这将帮助您在搜索控制器处于活动状态时隐藏导航栏。
searchController.isActive = false
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.navigationController?.navigationBar.isHidden = true
self.navigationController?.isNavigationBarHidden = true
self.navigationController?.pushViewController(<YourViewController>, animated: true)
}
您必须要求延迟才能导航,否则它会在控制台中向您发出有关导航控制器呈现过程的警告。
因此,此代码首先使您的搜索控制器处于非活动状态,然后导航到下一个视图控制器。
我遇到了同样的问题。尽管我在 viewWillAppear() 中隐藏了导航栏,但当搜索控制器在上一个视图中处于活动状态时,似乎有些东西使导航栏可见。
我通过在 viewWillLayoutSubviews() 中再次隐藏导航栏解决了这个问题:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
navigationController?.setNavigationBarHidden(true, animated: false)
}
Objective-C
-(void)viewWillDisappear:(BOOL)animated{
if (@available(iOS 13.0, *)) {
[self.navigationController.view setNeedsLayout];
[self.navigationController.view layoutIfNeeded];
}
}
Swift
func viewWillDisappear(_ animated: Bool) {
if (@available(iOS 13.0, *)) {
self.navigationController?.view.setNeedsLayout()
self.navigationController?.view.layoutIfNeeded()
}
}
我遇到了导航栏问题。我在 navigationItem 的搜索控制器中添加 searchController
。
查看下面的图片link: navigation bar issue
步骤:
1) 我在 table 视图中有数据,当我单击单元格时,它会打开带有自定义导航视图的详细信息屏幕。这工作正常。 (默认导航栏隐藏)
2) 现在,我点击了搜索栏,然后点击了 table 查看单元格。它向我展示了详细信息屏幕的默认导航栏。我不想显示默认导航栏。
我写的实现搜索控制器的代码如下:
searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.obscuresBackgroundDuringPresentation = false
searchController.searchBar.placeholder = "Search here..."
searchController.searchBar.tintColor = .white
searchController.searchBar.barTintColor = .white
if let textfield = searchController.searchBar.value(forKey: "searchField") as? UITextField {
textfield.textColor = UIColor.blue
if let backgroundview = textfield.subviews.first {
// Background color
backgroundview.backgroundColor = UIColor.white
// Rounded corner
backgroundview.layer.cornerRadius = 10;
backgroundview.clipsToBounds = true;
}
}
self.navigationItem.searchController = self.searchController
definesPresentationContext = true
下面是在 didSelect 方法中隐藏导航栏的代码:
self.navigationController?.navigationBar.isHidden = true
self.navigationController?.isNavigationBarHidden = true
您可以通过使搜索控制器处于非活动状态来解决此问题,然后在延迟一段时间后导航到您的详细信息视图控制器。
在您的 didSelect
方法中尝试以下代码,这将帮助您在搜索控制器处于活动状态时隐藏导航栏。
searchController.isActive = false
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.navigationController?.navigationBar.isHidden = true
self.navigationController?.isNavigationBarHidden = true
self.navigationController?.pushViewController(<YourViewController>, animated: true)
}
您必须要求延迟才能导航,否则它会在控制台中向您发出有关导航控制器呈现过程的警告。
因此,此代码首先使您的搜索控制器处于非活动状态,然后导航到下一个视图控制器。
我遇到了同样的问题。尽管我在 viewWillAppear() 中隐藏了导航栏,但当搜索控制器在上一个视图中处于活动状态时,似乎有些东西使导航栏可见。
我通过在 viewWillLayoutSubviews() 中再次隐藏导航栏解决了这个问题:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
navigationController?.setNavigationBarHidden(true, animated: false)
}
Objective-C
-(void)viewWillDisappear:(BOOL)animated{
if (@available(iOS 13.0, *)) {
[self.navigationController.view setNeedsLayout];
[self.navigationController.view layoutIfNeeded];
}
}
Swift
func viewWillDisappear(_ animated: Bool) {
if (@available(iOS 13.0, *)) {
self.navigationController?.view.setNeedsLayout()
self.navigationController?.view.layoutIfNeeded()
}
}