Ответ 1
Во-первых, в вашем 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 peekable. Итак, второе исправление в 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 работают во всех трех состояниях.