Tru*_*an1 16 uitableview ios swift uisearchcontroller peek-pop
Peek和Pop正在合作UISearchController.但是,一旦您开始使用表格,Peek和Pop就会停止工作updateSearchResults.
我使用UISearchController演示扩展了Apple的Table Search以支持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)
}
}
Run Code Online (Sandbox Code Playgroud)
搜索上下文控制器是否会干扰窥视和弹出(甚至可能是键盘)?当表最初所有数据时,我可以让它工作,但它没有一次我开始使用搜索.如果你想运行它并查看问题,我在这里附上了一个工作样本.
Dav*_*ton 18
首先,MainTableViewController.viewDidLoad()你需要注册你的resultsTableController.tableView,因为这是一个单独的视图,将收到偷看/弹出信息:
if traitCollection.forceTouchCapability == .available {
previewingContext = registerForPreviewing(with: self, sourceView: tableView)
if let resultVC = searchController.searchResultsController as? ResultsTableController {
resultVC.registerForPreviewing(with: self, sourceView: resultVC.tableView)
}
}
Run Code Online (Sandbox Code Playgroud)
在测试这个解决方案时,我注意到一个奇怪的问题,结果集中的第一行不可查看,结果集中的空行可以查看.所以,第二个修复previewingContext(_:viewControllerForLocation:):
func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
guard let tableView = previewingContext.sourceView as? UITableView,
let indexPath = tableView.indexPathForRow(at: location),
Run Code Online (Sandbox Code Playgroud)
在你的原代码,它使用tableView的财产MainTableViewController,而不是tableView那是sourceView对的相互作用.
现在,这在您搜索时有效,而在您不在时.但是,当您输入搜索但尚未输入任何搜索文本时,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)
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,当UISearchController呈现时,我们取消注册MainTableViewController并注册搜索控制器.当它被解雇时,我们反过来.
随着这些变化,所有三个州的偷看和流行工作.
| 归档时间: |
|
| 查看次数: |
1317 次 |
| 最近记录: |