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 работают во всех трех штатах.