我扩展了苹果的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,如果你想运行它看到的问题.
解决方法
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并注册搜索控制器.当被驳回时,我们做相反的事情.
随着这些变化,偷窥和流行在三个州的工作.
原文地址:https://www.jb51.cc/iOS/336010.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。