Peek和Pop正在与UISearchController合作.但是,当您开始使用updateSearchResults搜索表时,Peek和Pop停止工作.
我扩展了苹果的Table Search with UISearchController demo,以支持Peek和Pop为例:
问题是当我开始搜索表格时,Peek和Pop不再工作了.它只是选择突出显示:
我做的更新是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) } }
搜索上下文控制器是否干扰窥探和流行(甚至可以是键盘)?我可以让它工作,当表最初的所有数据,但它不是一旦我开始使用搜索.我附上一个working sample here,如果你想运行它看到的问题.
解决方法
首先,在您的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) } }
当测试这个解决方案时,我注意到一个奇怪的问题,结果集中的第一行不可窥视,结果集中的空白行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属性,而不是作为交互的sourceView的tableView.
现在,当你正在搜索,当你不是这样的时候,这样做是有效的.但是,当您输入搜索,但尚未输入任何搜索文本时,UISearchController处于活动状态,但是UITableView是MainTableViewController的UITableView,您不能将视图注册为源视图两次.所以,我们还有更多的工作要做:
// 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并注册搜索控制器.当被驳回时,我们做相反的事情.
随着这些变化,偷窥和流行在三个州的工作.