实现支持返回搜索结果的导航
Implementing navigation that supports going back to a search result
我希望实现这样的搜索,当用户按下搜索结果时,相关的 UIViewController
被推送到搜索结果本身,允许用户按下返回以再次查看搜索结果。
我试过简单地将 ViewController 推到演示 ViewController 的 UINavigationController
上。这导致搜索结果后面出现UIViewController
(取消搜索结果时可以看到)。
我也尝试过子类化 UINavigationController
并使其符合 UISearchResultsUpdating
,将更新代理到 UIViewController
。这导致几乎正确的行为,但是当视图控制器被推到 UINavigationController
上时,搜索栏仍然与导航栏保持一致,如下图所示。
我可以根据 UINavigationController
的状态对 hide/show 搜索栏简单地编写一些 hacky 代码,但似乎必须存在一种更简洁的方法来完成此操作。
苹果自己在他们的笔记应用程序中做到了这一点,如果你进行搜索并按下一个结果,你会被带到相关的笔记,按下后退会让你回到搜索结果。所以我想知道如何正确地复制这种行为。
我后来通过使负责显示搜索结果的 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
.
这当然可以按预期工作,到目前为止我还没有遇到任何错误。如果我下次查看此代码时找到更清晰的解决方案,post 是否会进行更新(在 iOS 9 中可能更容易)。
我希望实现这样的搜索,当用户按下搜索结果时,相关的 UIViewController
被推送到搜索结果本身,允许用户按下返回以再次查看搜索结果。
我试过简单地将 ViewController 推到演示 ViewController 的 UINavigationController
上。这导致搜索结果后面出现UIViewController
(取消搜索结果时可以看到)。
我也尝试过子类化 UINavigationController
并使其符合 UISearchResultsUpdating
,将更新代理到 UIViewController
。这导致几乎正确的行为,但是当视图控制器被推到 UINavigationController
上时,搜索栏仍然与导航栏保持一致,如下图所示。
我可以根据 UINavigationController
的状态对 hide/show 搜索栏简单地编写一些 hacky 代码,但似乎必须存在一种更简洁的方法来完成此操作。
苹果自己在他们的笔记应用程序中做到了这一点,如果你进行搜索并按下一个结果,你会被带到相关的笔记,按下后退会让你回到搜索结果。所以我想知道如何正确地复制这种行为。
我后来通过使负责显示搜索结果的 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
.
这当然可以按预期工作,到目前为止我还没有遇到任何错误。如果我下次查看此代码时找到更清晰的解决方案,post 是否会进行更新(在 iOS 9 中可能更容易)。