2017-02-13 18 views
14

Peek和Pop正在使用UISearchController。但是,一旦您開始使用updateSearchResults搜索表格,Peek和Pop將停止工作。UITableView單元上的窺視和流行失敗,使用UISearchController

我已經擴展蘋果的Table Search with UISearchController demo支持皮克和流行音樂爲例: enter image description here

問題是,當我開始搜索表,皮克和流行不工作了。它只是選擇它的亮點:

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

是搜索情境控制器PEEK和POP(甚至可以是鍵盤)干擾: enter image description here

我提出了到MainTableViewController是更新?當表格最初的所有數據都可以得到它時,我就可以開始使用搜索。如果您想運行並查看問題,我附加了一個working sample here

+0

你的問題是什麼? –

+0

我用屏幕截圖和更多細節更新了問題,thx :) – TruMan1

+0

我可以確認這不是阻止偷看和流行的鍵盤。我駁回了它,問題依然存在。 – TruMan1

回答

14

首先,在你MainTableViewController.viewDidLoad()您還需要註冊resultsTableController.tableView,因爲這是將接收PEEK /彈出信息的單獨視圖:

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), 

在你的原代碼,它是使用在MainTableViewController,而不是tableView那是sourceView的互動tableView財產。

現在,這個工程當你搜索,當你不是。但是,當您輸入搜索但尚未輸入任何搜索文本時,UISearchController處於活動狀態,但UITableViewMainTableViewController中的一個,而不能將註冊爲源視圖兩次。因此,我們有一點點更多的工作要做:

// 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爲零(根據Apple文檔:「searchResultsController:顯示搜索結果的視圖控制器。如果要顯示搜索結果,則指定nil顯示可搜索內容的相同視圖控制器。「 –

相關問題