UISearchController 解雇时的奇怪行为

UISearchController weird behavior on dismissing it

我正在将 UISearchController searchBar 添加到控制器的视图中,如下所示:self.view.addSubview(searchController.searchBar)。该功能运行良好,除了在选择表格视图行时搜索栏快速向下移动并从顶部重新出现。我尝试了以下方法,none 结果成功了:

  1. 设置tableView.tableHeaderView = searchController.searchBar而不是直接添加到视图
  2. searchController.searchBar 添加到我拖到控制器上的单独视图,并在其上设置约束。尝试对新创建的视图和搜索栏进行裁剪。
  3. 将控制器嵌入UINavigationViewController并设置self.navigationItem.titleView = searchController.searchBar。我定义了searchBar的框架,还是没有。
  4. 尝试使用情节提要中的 Extend Edges 功能(在顶栏下等),但没有选择成功
  5. 添加行(到 viewDIdLoad):

    self.extendedLayoutIncludesOpaqueBars = true

    self.definesPresentationContext = true

如有任何帮助,我们将不胜感激。

如果您正在使用故事板,您可以通过选择视图控制器并在属性检查器中取消选择调整滚动视图插图来更改它。

在尝试了所有建议并通过互联网搜索后,我注意到 UISearchController 实现的工作示例是在 UITableViewController 中完成的,但我有 UIViewController上面有 UITableViewDataSourceUITableViewDelegate 协议。不幸的是,由于应用程序架构,我无法直接拥有 UITableViewController,因此我需要重组应用程序,使其具有 UINavigationController,我将 searchBar 嵌入 navigationItem.titleView ](而不是像他们在各种教程中经常做的那样将其设置为 tableView.tableHeaderView,因为我需要修复 searchBar,而不是在我们滚动时隐藏)并且它起作用了。这是最终的工作应用程序架构的样子:

TrainingContainerViewController 有两个 Container View,其中一个我们嵌入 TrainingFilterTableViewController,显示自动完成功能的最终结果(在单击自动完成行后)。另一个 Container View 嵌入 UINavigationController(在左侧),后者又将 TrainingSearchTableViewController 作为其子项。

设置 UISearchController 及其 searchBar 的代码位于 TrainingSearchTableViewControllers' viewDidLoad 中,如下所示:

override func viewDidLoad() {
    super.viewDidLoad()

    searchController.searchResultsUpdater = self
    searchController.hidesNavigationBarDuringPresentation = false
    searchController.dimsBackgroundDuringPresentation = false
    searchController.searchBar.sizeToFit()
    searchController.delegate = self
    navigationItem.titleView = searchController.searchBar
    tableView.hidden = true

    ...
}

修复 XCode 8.2.1Swift 2.3 中的错误不需要其他任何东西,只需更改架构,以便在应用程序中使用 UITableViewController 并使用它代替 UIViewController.