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

标签 ios swift uitableview uisearchcontroller peek-pop

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

我扩展了 Apple 的 Table Search with UISearchController demo以支持 Peek 和 Pop 为例: enter image description here

问题是当我开始搜索表格时,Peek 和 Pop 不再起作用。它只是选择突出显示它: enter image description here

我对 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)
    }
}

搜索上下文 Controller 是否会干扰 peek 和 pop(甚至可能是键盘)?当表最初包含所有数据时,我可以让它工作,但一旦我开始使用搜索,它就不会工作。我附上了 working sample here如果您想运行它并查看问题。

最佳答案

首先,在您的 MainTableViewController.viewDidLoad() 中您还需要注册您的 resultsTableController.tableView ,因为这是一个单独的 View ,将接收 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),

在您的原始代码中,它使用的是 tableView MainTableViewController 上的属性(property)而不是 tableView那是 sourceView用于交互。

现在,这在您搜索和不搜索时都有效。但是,当您输入搜索但尚未输入任何搜索文本时,UISearchController处于事件状态,但 UITableView是来自 MainTableViewController 的那个,并且您不能将 View 注册为源 View 两次。因此,我们还有一些工作要做:

// 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并注册搜索 Controller 。当它被驳回时,我们做相反的事情。

通过这些更改,peek 和 pop 在所有三种状态下都有效。

关于ios - UITableView 单元格上的 Peek 和 Pop 因 UISearchController 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42196749/

相关文章:

ios - 删除导航栏下方的阴影线而不删除栏颜色?

ios - 如何使用 InAppSettingsKit 委托(delegate)重新配置已更改的应用程序设置

swift - 从 UITableViewController 中的单元格引用文本字段

ios - 迪尔德 : Symbol not found: _OBJC_CLASS_$_UIUserNotificationSettings when trying to run on iOS7

swift - 缓存的图像闪烁

swift - UITableView 折叠动画速度

ios - 属性、线程、内存管理和摇滚

iphone - 在没有导航的 ipad 应用程序中单击按钮打开 View (另一个 xib)

ios - 使用 NSFetchedResultsController 移动行的方法及其委托(delegate)不起作用

带有 where 子句的 Swift 数组扩展不适用于子协议(protocol)