16

Peek and Pop 正在使用UISearchController. 但是,一旦您开始使用 搜索表格,Peek and Pop 就会停止工作updateSearchResults

用 UISearchController 演示扩展了 Apple 的表搜索,以支持 Peek 和 Pop 作为示例: 在此处输入图像描述

问题是当我开始搜索表格时,Peek and 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)
    }
}

搜索上下文控制器是否干扰 peek and pop(甚至可能是键盘)?当表格最初是所有数据时,我可以让它工作,但一旦我开始使用搜索,它就不会工作。如果您想运行它并查看问题,我在此处附加了一个工作示例。

4

1 回答 1

18

首先,您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)
    }
}

在测试这个解决方案时,我注意到一个奇怪的问题,结果集中的第一行是不可窥视的,而结果集中的空白行是可窥视的。所以,第二个修复previewingContext(_:viewControllerForLocation:)

func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
    guard let tableView = previewingContext.sourceView as? UITableView,
        let indexPath = tableView.indexPathForRow(at: location),

在您的原始代码中,它使用的是属性tableViewMainTableViewController而不是交互的属性。tableViewsourceView

现在,这在您搜索和不搜索时都有效。但是,当您已输入搜索但尚未输入任何搜索文本时, 处于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并注册搜索控制器。当它被解雇时,我们做相反的事情。

通过这些更改,peek 和 pop 可以在所有三种状态下工作。

于 2017-02-15T23:20:24.320 回答