使用UISearchController时,UITableView单元上的Peek和Pop失败
Peek和Pop正在使用UISearchController
。 但是,一旦开始使用updateSearchResults
search表,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
属性,而不是用于交互的sourceView
的tableView
。
现在,当你正在search时,这个工作,而当你不在。 但是,如果您已经inputsearch内容,但尚未input任何search文本,则UISearchController
处于活动状态,但UITableView
是MainTableViewController
的一个,并且无法将视图注册为源视图两次。 所以,我们还有更多的工作要做:
// 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行在所有这三个州工作。