UITableView单元格上的Peek和Pop因UISearchController而失败

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它处于活动状态,但是来自的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)
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上,当UISearchController呈现时,我们取消注册MainTableViewController并注册搜索控制器.当它被解雇时,我们反过来.

随着这些变化,所有三个州的偷看和流行工作.