首先,在你的MainTableViewController.viewDidLoad()
您还需要注册您的resultsTableController.tableView
,因为这是一个单独的视图,将接收 peek/pop 信息:
if traitCollection.forceTouchCapability == .available {
previewingContext = registerForPreviewing(with: self, sourceView: tableView)
if let resultVC = searchController.searchResultsController as? ResultsTableController {
resultVC.registerForPreviewing(with: self, sourceView: resultVC.tableView)
}
}
在测试这个解决方案时,我注意到一个奇怪的问题,结果集中的第一行不可查看,而结果集中的空白行是可查看的。所以,第二个修复previewingContext(_:viewControllerForLocation:)
:
func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
guard let tableView = previewingContext.sourceView as? UITableView,
let indexPath = tableView.indexPathForRow(at: location),
在您的原始代码中,它使用的是tableView
财产在MainTableViewController
而不是tableView
那是sourceView
用于交互。
现在,无论您在搜索还是不在搜索时,这都有效。但是,当您输入搜索但尚未输入任何搜索文本时,UISearchController
是活跃的,但是UITableView
是来自MainTableViewController
, 你呢cannot将一个视图注册为源视图两次。所以,我们还有一些工作要做:
// local property to store the result from registerForPreviewing(with:sourceView:)
var previewingContext: UIViewControllerPreviewing?
func didPresentSearchController(_ searchController: UISearchController) {
if let context = previewingContext {
unregisterForPreviewing(withContext: context)
previewingContext = searchController.registerForPreviewing(with: self, sourceView: tableView)
}
}
func didDismissSearchController(_ searchController: UISearchController) {
if let context = previewingContext {
searchController.unregisterForPreviewing(withContext: context)
previewingContext = registerForPreviewing(with: self, sourceView: tableView)
}
}
基本上,当UISearchController
出现后,我们取消注册MainTableViewController
并注册搜索控制器。当它被驳回时,我们做相反的事情。
通过这些更改,peek 和 pop 在所有三个状态下都可以工作。