从搜索控制器导航后缺少导航栏

Posted

技术标签:

【中文标题】从搜索控制器导航后缺少导航栏【英文标题】:Missing navigation bar after navigating from search controller 【发布时间】:2015-07-07 20:10:14 【问题描述】:

以下场景:

我有一个带有导航控制器和表格视图的主视图。转到详细视图。我在导航栏上添加了一个类似于Apple UICatalog 的搜索控制器。我从搜索结果控制器向详细视图添加了另一个 segue。

问题

当我在 normale tableview 中选择一行时,详细视图包含一个导航栏,并且行为符合预期。 当我在结果搜索控制器中执行搜索并选择一行时,显示的详细视图中缺少导航栏。我知道结果视图控制器现在有了导航栏。

问题

我应该怎么做才能从标准导航堆栈中获取导航栏?我尽量避免手动将导航栏添加到详细视图,因为当我来自正常表视图时它正在工作。

更新

我在主表视图中添加了一个额外的转场到搜索表视图。

当我调用搜索时:showViewController(searchController, sender: tableView) 我得到导航栏,但没有搜索输入。使用presentViewController(searchController, animated: true, completion: nil),我得到了搜索视图,但导航栏在详细视图中消失了。

【问题讨论】:

【参考方案1】:

我正在用另一种方式搜索,将主表视图控制器用作searchResultViewController。俄语中有一个awesome tutorial(但您可以阅读英文代码)。

它帮助我设置了搜索栏。

不想看就试试

searchController.hidesNavigationBarDuringPresentation = false

ViewDidLoad 方法中。

【讨论】:

【参考方案2】:

如果您按照 segues 进行操作,您会看到导航控制器和搜索控制器之间没有链接。搜索控制器根本不在导航堆栈上,因此在搜索结果时,您不会得到一个栏。为了能够导航回您的搜索控制器,您需要从普通的 tableview 转到它,或者使用第二个导航控制器,将搜索控制器作为其根视图,就像您的主视图一样。

【讨论】:

我尝试了两种变体。两者都没有明显的结果。导航控制器为零。 哪个导航控制器是零?在您上面的图片中,您的搜索控制器根本没有连接到导航控制器。为了将所有这些场景放在同一个导航堆栈上,您必须从主节点到搜索结果进行推送,然后从结果推送到细节。 我在结果表视图中添加了一个导航控制器。在涉及搜索并选择结果后,导航控制器为零。当左侧的主导航控制器与结果表视图控制器连接时,它似乎工作(在 IB 中是可见的导航栏)。但是当我运行应用程序时,它们在详细视图中仍然没有导航栏。【参考方案3】:

终于找到了解决办法。我放弃了结果视图控制器并在原始表视图控制器中处理结果。在导航到详细视图之前,我会隐藏搜索栏(如果处于活动状态):

    if searchController.active 
        searchController.searchBar.hidden = true
    

当我返回主视图控制器时,我再次取消隐藏搜索栏。

    if self.searchController.active 
        self.searchController.searchBar.hidden = false
    

【讨论】:

上面的代码对我不起作用,但我能够通过使用一个 ViewController 并声明 self.definesPresentationContext = true 来让它工作【参考方案4】:

presentViewController 将视图控制器显示在导航堆栈之外,如果您想将其放入导航堆栈中,您应该像这样使用pushViewController

self.navigationController?.pushViewController(searchController, animated: true)

如果 searchController 是顶视图控制器,您可以根据需要编辑导航栏外观

【讨论】:

【参考方案5】:

可能在某些代码或情节提要中隐藏了导航栏。只需尝试将以下行放入您要显示导航栏的控制器文件中:

self.navigationController?.navigationBarHidden = false

【讨论】:

没有帮助。 :-( 导航控制器为零。【参考方案6】:

在推送或呈现到下一个 ViewController 之前,我添加了这一行

self.navigationController?.isNavigationBarHidden = false

它对我有用

【讨论】:

以上是关于从搜索控制器导航后缺少导航栏的主要内容,如果未能解决你的问题,请参考以下文章

segue 样式“替换”后缺少导航栏按钮项

视图控制器上缺少导航栏

搜索显示控制器如何隐藏导航栏?

执行 push segue 后,当给搜索栏焦点时,导航栏隐藏

iOS 7 导航栏中的搜索栏

在弹出窗口的标签栏中取消导航控制器中的 UITableView 搜索后,UINavigationBar 无响应