在 UINavigationBar 上呈现 UISearchController 时推送视图控制器

Posted

技术标签:

【中文标题】在 UINavigationBar 上呈现 UISearchController 时推送视图控制器【英文标题】:Pushing view controller when presenting UISearchController over UINavigationBar 【发布时间】:2016-04-29 17:11:33 【问题描述】:

我已经实现了UISearchController,以便在点击搜索图标时它出现在UINavigationBar 之上。过滤表格后,用户应该能够选择将推送新视图控制器的行。问题在于这样做时,搜索控制器仍显示在导航栏上方。

我对此进行了研究,建议您将self.definedPresentationContext 设置为true。当搜索栏显示在导航栏上方时,这不起作用。当您点击搜索图标时,键盘会出现,但搜索栏没有动画。

我发现的另一个选项是通过将active 设置为false 来关闭viewWillDisappear 中的搜索控制器。这个解决方案的问题是它在推送过渡期间动画消失了。当您返回时,搜索显然不再有效,因此用户丢失了搜索上下文并显示了所有结果。

我想知道如何推送视图控制器,保持搜索处于活动状态,但不显示下一个视图控制器上方的搜索界面。理想情况下,搜索界面会在新的视图控制器被推送时被推向左侧,并在滑回搜索结果时返回。

我已经调整了 Apple 的 UIKit 目录示例代码以显示不受欢迎的行为。要重现该问题,download this project,在 iPhone 上运行它,点击返回按钮,选择搜索,选择在导航栏上显示,点击搜索图标,输入搜索词,然后选择一个结果。请注意,搜索栏仍然可见。这是来自SearchPresentOverNavigationBarViewController.swift的代码:

override func viewWillDisappear(animated: Bool) 
    super.viewWillDisappear(animated)

    if searchController.active 
        //searchController.active = false //undesirably dismisses search, animates away during push, upon going back search is not active
    


@IBAction func searchButtonClicked(button: UIBarButtonItem) 
    //self.definesPresentationContext = true //causes the search to not appear

    searchController = UISearchController(searchResultsController: nil)
    searchController.searchResultsUpdater = self
    searchController.dimsBackgroundDuringPresentation = false
    searchController.hidesNavigationBarDuringPresentation = false

    presentViewController(searchController, animated: true, completion: nil)

【问题讨论】:

【参考方案1】:

我参加演出有点晚了,但我最近发现自己处于类似情况并想分享我的经验。

假设您已经展示了您的搜索界面,用户在搜索字段中输入了一些内容,并且您向他们展示了一些结果。选择结果后,我将新视图控制器推送到原始导航控制器,即包含呈现搜索界面的视图控制器的导航控制器。当我这样做时,搜索界面被推到左侧,当您点击返回按钮时,搜索界面被带回并保留其状态(查询和结果)。

我应该提到,在包含可搜索内容的控制器中,即呈现搜索界面的控制器中,我启用了呈现上下文。

另外,我的搜索栏集成在显示搜索内容的表格视图的标题视图中,因此我没有明确显示搜索界面 - 当用户在搜索字段内点击时,它会自动上升并推送导航栏离开屏幕。这是我能想到的我们设置的唯一区别。无论如何,希望这可以帮助你。干杯!

【讨论】:

嗨卢波!在搜索结果表视图上按下结果后,如何准确推送详细视图控制器?您使用委托或其他东西将它传递给根导航vc?

以上是关于在 UINavigationBar 上呈现 UISearchController 时推送视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

呈现 UIViewController 后 iOS UINavigationBar 损坏

奇怪的 UINavigationBar 行为?

在 UINavigationBar 中隐藏或禁用 UIBarButtonItem

在 popViewControllerAnimated 之后 UINavigationBar 下的 UITableView

更改 UIActivityViewController UINavigationBar 颜色

react-交互-异步uis