使用UISearchController时,UITableView单元上的Peek和Pop失败

Peek和Pop正在使用UISearchController 。 但是,一旦开始使用updateSearchResultssearch表,Peek和Pop将停止工作。

我已经使用UISearchController演示扩展了Apple的Table Search以支持Peek和Pop作为示例: 在这里输入图像说明

问题是当我开始search表时,Peek和Pop不再工作。 它只是select突出显示它: 在这里输入图像说明

我做的更新是MainTableViewController是:

 class MainTableViewController: BaseTableViewController, UISearchBarDelegate, UISearchControllerDelegate, UISearchResultsUpdating { override func viewDidLoad() { super.viewDidLoad() ... if traitCollection.forceTouchCapability == .available { registerForPreviewing(with: self, sourceView: tableView) } } } extension MainTableViewController: UIViewControllerPreviewingDelegate { func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? { guard let indexPath = tableView?.indexPathForRow(at: location), let cell = tableView?.cellForRow(at: indexPath), let controller = storyboard?.instantiateViewController(withIdentifier: "DetailViewController") as? DetailViewController else { return nil } previewingContext.sourceRect = cell.frame controller.product = products[0] return controller } func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) { guard let controller = viewControllerToCommit as? DetailViewController else { return } controller.product = products[0] show(controller, sender: self) } } 

search上下文控制器是干扰偷看和stream行(甚至可能是键盘)? 当表最初的所有数据,我可以得到它的工作,但它不一次,我开始使用search。 如果你想运行它并看到问题,我在这里附上一个工作示例 。

首先,在您的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) } } 

在testing这个解决scheme时,我注意到了一个奇怪的问题,结果集中的第一行是不可见的,结果集WERE中的空白行是可见的。 所以,在previewingContext(_:viewControllerForLocation:)的第二个修复:

 func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? { guard let tableView = previewingContext.sourceView as? UITableView, let indexPath = tableView.indexPathForRow(at: location), 

在原始代码中,它使用MainTableViewController上的tableView属性,而不是用于交互的sourceViewtableView

现在,当你正在search时,这个工作,而当你不在。 但是,如果您已经inputsearch内容,但尚未input任何search文本,则UISearchController处于活动状态,但UITableViewMainTableViewController的一个,并且无法将视图注册为源视图两次。 所以,我们还有更多的工作要做:

 // 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并注册search控制器。 当它被解雇时,我们做相反的事情。

随着这些变化,偷窥和stream行在所有这三个州工作。