Peek and Pop на ячейках UITableView завершается неудачно с UISearchController

Peek and Pop работает с UISearchController, Тем не менее, Peek и Pop перестает работать, как только вы начинаете поиск в таблице с помощью updateSearchResults,

Я расширил поиск таблиц в Apple с помощью демо- версии UISearchController для поддержки 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)
    }
}

Контроллер контекста поиска мешает заглядывать и всплывать (может быть, даже клавиатура)? Я могу заставить его работать, когда в таблице изначально все данные, но это не один раз, когда я начинаю использовать поиск. Я приложил рабочий образец здесь, если вы хотите запустить его и увидеть проблему.

1 ответ

Решение

Во-первых, в вашем 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)
    }
}

При тестировании этого решения я заметил странную проблему, заключающуюся в том, что первая строка в наборе результатов не была доступна для просмотра, а пустые строки в наборе результатов WERE были доступны для просмотра. Итак, второе исправление в 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 вместо 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)
    }
}

В основном, когда UISearchController представлен, мы отменили регистрацию MainTableViewController и зарегистрируйте поисковый контроллер. Когда это уволено, мы делаем обратное.

С этими изменениями, Peek и Pop работают во всех трех штатах.

Другие вопросы по тегам