实现支持返回搜索结果的导航

时间:2015-06-09 07:53:52

标签: ios uitableview swift uinavigationcontroller uisearchcontroller

我希望实现搜索,以便当用户按下搜索结果时,相关的UIViewController会被推送到搜索结果本身,允许用户再次按下以再次查看搜索结果。

我尝试将ViewController简单地推送到呈现的ViewController' s UINavigationController。这会导致UIViewController出现在搜索结果后面(取消搜索结果时可以看到)。

我还尝试了对UINavigationController进行子类化并使其符合UISearchResultsUpdating,代理UIViewController的更新。这导致几乎正确的行为,但当视图控制器被推到UINavigationController时,搜索栏仍保留在导航栏中,如下图所示。

我可以简单地做一些hacky代码来隐藏/显示搜索栏,具体取决于UINavigationController的状态,但似乎必须有更清晰的方法来实现这一点。

Apple已经在他们的Notes应用程序中完成了这项工作,如果您进行搜索并按结果,您将被带到相关注释,按下后退会返回搜索结果。所以我想知道如何正确地复制这种行为。

enter image description here

1 个答案:

答案 0 :(得分:1)

我后来通过使负责显示搜索结果的UIViewController符合UINavigationControllerDelegate协议(除了UISearchResultsUpdating)来解决这个问题。然后updateSearchResultsForSearchController(searchController: UISearchController)方法捕获并存储对作为参数传递的UISearchController的引用。然后,在UINavigationControllerDelegate代码中使用视图逻辑进行操作会使一切工作正常并且看起来像预期的那样:

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
    if viewController == self {
        searchController.searchBar.hidden = false
        searchController.searchBar.becomeFirstResponder()
    } else {
        searchController.searchBar.hidden = true
        searchController.searchBar.resignFirstResponder()
    }
}

最后,正如上面第三段所述,我创建了一个UINavigationController的子类,它被指定为搜索结果控制器,并将导航事件和UISearchResultsUpdating事件委托给UIViewController }。

这肯定按预期工作,到目前为止我没有遇到任何错误。如果我在下次查看此代码时找到更清晰的解决方案,则会发布更新(在iOS 9中可能更容易)。