2017-02-13 10 views
14

PeekとPopがUISearchControllerで動作しています。ただし、PeekとPopは、updateSearchResultsを使用してテーブルの検索を開始すると機能しなくなります。UITableViewセルでPeekとPopがUISearchControllerで失敗する

私は、一例として覗くとポップをサポートするために、AppleのTable Search with UISearchController demoを拡張しました: enter image description here

問題は、私は、テーブルの検索を開始するとき、覗くとポップはもう動作しませんです。それはちょうどハイライトにそれを選択: 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

まず、それはPEEK /ポップ情報を受信する別の図であるので、あなたの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) 
    } 
} 

このソリューションをテストする場合は、私がいることを、奇妙な問題に気づきました結果セットの最初の行は見開きではなく、結果セットの空白の行が見えるようになりました。だから、previewingContext(_:viewControllerForLocation:)における第二の修正:あなたの元のコードで

func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? { 
    guard let tableView = previewingContext.sourceView as? UITableView, 
     let indexPath = tableView.indexPathForRow(at: location), 

は、それが代わりに相互作用のためのsourceViewtableViewMainTableViewControllertableViewプロパティを使用していました。

これは、検索しているときとそうでないときに機能します。ただし、検索を入力してもまだ検索テキストを入力していない場合は、UISearchControllerが有効ですが、は、MainTableViewControllerからのものです。はビューをソースビューとして2回登録できません。だから、私たちが行うにはもう少し作業があります。UISearchControllerが提示されたときに

// 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) 
    } 
} 

は基本的に、我々はMainTableViewControllerの登録を解除し、検索コントローラを登録します。それが解雇されると、我々はその逆を行う。

これらの変更により、peekとpopは3つの州すべてで機能します。

+0

@ TruMan1、私の答えは役に立ちましたか? –

+0

ありがとうございます!はっきりとすべての州のために働く。 – TruMan1

+0

別のsearchResultsControllerを持っている限り、これは正常に動作します。ただし、テーブルビューコントローラ自体を使用して検索結果を表示する場合、searchController.searchResultsControllerはnilです(Applesドキュメントのとおり)。「searchResultsController:検索結果を表示するView Controller。検索結果を表示する場合はnilを指定します。検索可能なコンテンツを表示するのと同じView Controller。" –

関連する問題