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

May*_*mur 8 uinavigationbar ios swift uisearchcontroller

我正面临导航栏的问题。我正在添加searchController导航项的搜索控制器。

请参阅以下链接上的图片: 导航栏问题

脚步:

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
Run Code Online (Sandbox Code Playgroud)

下面是在 didSelect 方法中隐藏导航栏的代码:

self.navigationController?.navigationBar.isHidden = true
self.navigationController?.isNavigationBarHidden = true
Run Code Online (Sandbox Code Playgroud)

小智 9

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

我通过在 viewWillLayoutSubviews() 中再次隐藏导航栏来解决它:

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    navigationController?.setNavigationBarHidden(true, animated: false)
}
Run Code Online (Sandbox Code Playgroud)


Sag*_*han 3

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

尝试在您的方法中使用以下代码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)
}
Run Code Online (Sandbox Code Playgroud)

您必须需要延迟才能导航,否则它会在控制台中向您发出有关导航控制器呈现过程的警告。

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