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

时间:2016-04-29 17:11:34

标签: ios uinavigationbar uisearchcontroller

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

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

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

我想知道如何推送视图控制器,保持搜索活动,但不显示搜索界面超过下一个视图控制器。理想情况下,当推送新视图控制器时,搜索界面将被推向左侧,并在刷回搜索结果时返回。

我调整了Apple的UIKit Catalog示例代码,以显示不良行为。要重现问题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 个答案:

答案 0 :(得分:0)

我在节目中有点晚了,但我最近发现自己处于类似情况,想分享我的经验。

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

我应该提一下,在包含可搜索内容的控制器中,提供搜索界面的内容,我启用了演示文稿上下文。

此外,我的搜索栏已集成在显示搜索内容的表格视图的标题视图中,因此我无法明确显示搜索界面 - 当用户点按搜索字段时,它会自动上升并将导航栏推出屏幕。这是我能想到的唯一不同的设置。无论如何,希望这对你有所帮助。干杯!