微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

UISableView单元上的ios – Peek和Pop在UISearchController中失败

Peek和Pop正在与UISearchController合作.但是,当您开始使用updateSearchResults搜索表时,Peek和Pop停止工作.

我扩展了苹果的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,如果你想运行它看到的问题.

解决方法

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

当测试这个解决方案时,我注意到一个奇怪的问题,结果集中的第一行不可窥视,结果集中的空白行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 举报,一经查实,本站将立刻删除。

相关推荐