2017-02-13 25 views
14

Peek and Pop работает с UISearchController. Однако Peek и Pop перестают работать после того, как вы начнете поиск в таблице, используя updateSearchResults.Peek и Pop на UITableView ячейки сбой с UISearchController

я расширил компании Apple Table Search with UISearchController demo для поддержки Peek и поп в качестве примера: enter image description here

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

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

+0

В чем проблема? –

+0

Я обновил вопрос со скриншотами и более подробной информацией, thx :) – TruMan1

+0

Я могу подтвердить, что это не клавиатура, которая блокирует просмотр и поп. Я отклонил его, и проблема осталась. – TruMan1

ответ

14

Во-первых, в вашем 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 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 и зарегистрировать контроллер поиска. Когда он отклоняется, мы делаем обратное.

С этими изменениями, просмотр и поп-работа во всех трех состояниях.

+0

@ TruMan1, был ли мой ответ полезным? –

+0

Да, спасибо! Для ясного и все штаты работают. – TruMan1

+0

Это работает отлично, пока у вас есть отдельный searchResultsController. Однако, если вы используете сам контроллер табличного представления для отображения результатов поиска, searchController.searchResultsController равен нулю (в соответствии с документами яблок: «searchResultsController: контроллер просмотра, который отображает результаты поиска. Укажите nil, если вы хотите отобразить результаты поиска в тот же контроллер просмотра, который отображает ваш доступный для поиска контент.« –