搜索处于活动状态并推送到下一个视图控制器时出现导航栏问题

Posted

技术标签:

【中文标题】搜索处于活动状态并推送到下一个视图控制器时出现导航栏问题【英文标题】:Navigation bar issue when search is active and push to next view controller 【发布时间】:2018-07-18 12:54:45 【问题描述】:

我遇到了导航栏的问题。我在 navigationItem 的搜索控制器中添加了searchController

查看以下链接中的图片: navigation bar issue

步骤:

1) 我在表格视图中有数据,当我单击单元格时,它会打开带有自定义导航视图的详细信息屏幕。这工作正常。 (默认导航栏隐藏)

2) 现在,我点击了搜索栏,然后点击了表格视图单元格。它向我显示默认导航栏到详细信息屏幕。我不想显示默认导航栏。

我为实现搜索控制器而编写的代码如下:

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

【问题讨论】:

你是如何隐藏导航栏的?tableView(_ tableView: didSelectRowAt indexPath: ) 的代码是什么? @zero3nna,请看我的更新问题,我确实添加了隐藏导航栏的代码。 【参考方案1】:

我遇到了同样的问题。尽管我在 viewWillAppear() 中隐藏了导航栏,但当搜索控制器在前一个视图中处于活动状态时,似乎有些东西使导航栏可见。

我通过在 viewWillLayoutSubviews() 中再次隐藏导航栏解​​决了这个问题:

override func viewWillLayoutSubviews() 
    super.viewWillLayoutSubviews()
    navigationController?.setNavigationBarHidden(true, animated: false)

【讨论】:

我刚刚添加了这个(甚至在viewWillAppear 中没有,只是在viewWillLayoutSubviews 中),它完美地工作!谢谢戴夫:) 我试过 viewDidLoad、viewWillAppear、viewDidAppear。我尝试在搜索视图上添加自定义导航栏。没有任何效果。 3天后,我找到了这个答案。非常感谢! 这应该是公认的答案,因为此解决方案意味着如果这是必需的功能,searchController 可以在前一个视图中保持活动状态。【参考方案2】:

您可以通过使搜索控制器处于非活动状态来解决此问题,然后在延迟一段时间后导航到您的详细信息视图控制器。

在您的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)

您必须延迟导航,否则它会在控制台中向您发出有关导航控制器演示过程的警告。

因此,此代码首先使您的搜索控制器处于非活动状态,然后导航到您的下一个视图控制器。

【讨论】:

这项工作对我有用..但搜索状态不保持..是否也可以保持搜索状态? 是的,您必须存储以前的搜索文本,当返回时,只需将其分配给搜索文本字段并在有数据时重新加载表格。【参考方案3】:

Objective-C

-(void)viewWillDisappear:(BOOL)animated
    if (@available(ios 13.0, *)) 
        [self.navigationController.view setNeedsLayout]; 
        [self.navigationController.view layoutIfNeeded];
    

斯威夫特

func viewWillDisappear(_ animated: Bool) 
    if (@available(iOS 13.0, *)) 
         self.navigationController?.view.setNeedsLayout()     
         self.navigationController?.view.layoutIfNeeded()
    

【讨论】:

以上是关于搜索处于活动状态并推送到下一个视图控制器时出现导航栏问题的主要内容,如果未能解决你的问题,请参考以下文章

当搜索栏处于活动状态时,快速表视图被锁定

当 UISearchController 处于活动状态时呈现 UIAlertController

关闭并滑动以关闭搜索控制器处于活动状态的问题

StoryBoard 导航到根视图控制器

在 UISearchController 处于活动状态时选择 tableview 中的单元格,不显示下一个视图?

worklight ant task app-deployer - WL 控制台安全处于活动状态时出现未经授权的错误