UISearchController 解雇时的奇怪行为
UISearchController weird behavior on dismissing it
我正在将 UISearchController
searchBar 添加到控制器的视图中,如下所示:self.view.addSubview(searchController.searchBar)
。该功能运行良好,除了在选择表格视图行时搜索栏快速向下移动并从顶部重新出现。我尝试了以下方法,none 结果成功了:
- 设置
tableView.tableHeaderView = searchController.searchBar
而不是直接添加到视图
- 将
searchController.searchBar
添加到我拖到控制器上的单独视图,并在其上设置约束。尝试对新创建的视图和搜索栏进行裁剪。
- 将控制器嵌入
UINavigationViewController
并设置self.navigationItem.titleView = searchController.searchBar
。我定义了searchBar的框架,还是没有。
- 尝试使用情节提要中的
Extend Edges
功能(在顶栏下等),但没有选择成功
添加行(到 viewDIdLoad
):
self.extendedLayoutIncludesOpaqueBars = true
self.definesPresentationContext = true
如有任何帮助,我们将不胜感激。
如果您正在使用故事板,您可以通过选择视图控制器并在属性检查器中取消选择调整滚动视图插图来更改它。
在尝试了所有建议并通过互联网搜索后,我注意到 UISearchController
实现的工作示例是在 UITableViewController
中完成的,但我有 UIViewController
上面有 UITableViewDataSource
和 UITableViewDelegate
协议。不幸的是,由于应用程序架构,我无法直接拥有 UITableViewController
,因此我需要重组应用程序,使其具有 UINavigationController
,我将 searchBar
嵌入 navigationItem.titleView
](而不是像他们在各种教程中经常做的那样将其设置为 tableView.tableHeaderView
,因为我需要修复 searchBar
,而不是在我们滚动时隐藏)并且它起作用了。这是最终的工作应用程序架构的样子:
TrainingContainerViewController
有两个 Container View
,其中一个我们嵌入 TrainingFilterTableViewController
,显示自动完成功能的最终结果(在单击自动完成行后)。另一个 Container View
嵌入 UINavigationController
(在左侧),后者又将 TrainingSearchTableViewController
作为其子项。
设置 UISearchController
及其 searchBar
的代码位于 TrainingSearchTableViewController
s' 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.1
和 Swift 2.3
中的错误不需要其他任何东西,只需更改架构,以便在应用程序中使用 UITableViewController
并使用它代替 UIViewController
.
我正在将 UISearchController
searchBar 添加到控制器的视图中,如下所示:self.view.addSubview(searchController.searchBar)
。该功能运行良好,除了在选择表格视图行时搜索栏快速向下移动并从顶部重新出现。我尝试了以下方法,none 结果成功了:
- 设置
tableView.tableHeaderView = searchController.searchBar
而不是直接添加到视图 - 将
searchController.searchBar
添加到我拖到控制器上的单独视图,并在其上设置约束。尝试对新创建的视图和搜索栏进行裁剪。 - 将控制器嵌入
UINavigationViewController
并设置self.navigationItem.titleView = searchController.searchBar
。我定义了searchBar的框架,还是没有。 - 尝试使用情节提要中的
Extend Edges
功能(在顶栏下等),但没有选择成功 添加行(到
viewDIdLoad
):self.extendedLayoutIncludesOpaqueBars = true
self.definesPresentationContext = true
如有任何帮助,我们将不胜感激。
如果您正在使用故事板,您可以通过选择视图控制器并在属性检查器中取消选择调整滚动视图插图来更改它。
在尝试了所有建议并通过互联网搜索后,我注意到 UISearchController
实现的工作示例是在 UITableViewController
中完成的,但我有 UIViewController
上面有 UITableViewDataSource
和 UITableViewDelegate
协议。不幸的是,由于应用程序架构,我无法直接拥有 UITableViewController
,因此我需要重组应用程序,使其具有 UINavigationController
,我将 searchBar
嵌入 navigationItem.titleView
](而不是像他们在各种教程中经常做的那样将其设置为 tableView.tableHeaderView
,因为我需要修复 searchBar
,而不是在我们滚动时隐藏)并且它起作用了。这是最终的工作应用程序架构的样子:
TrainingContainerViewController
有两个 Container View
,其中一个我们嵌入 TrainingFilterTableViewController
,显示自动完成功能的最终结果(在单击自动完成行后)。另一个 Container View
嵌入 UINavigationController
(在左侧),后者又将 TrainingSearchTableViewController
作为其子项。
设置 UISearchController
及其 searchBar
的代码位于 TrainingSearchTableViewController
s' 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.1
和 Swift 2.3
中的错误不需要其他任何东西,只需更改架构,以便在应用程序中使用 UITableViewController
并使用它代替 UIViewController
.