2017-02-13 9 views
14

के साथ विफल रहता है Peek और Pop UISearchController के साथ काम कर रहा है। हालांकि, updateSearchResults का उपयोग करके तालिका खोजना शुरू करने के बाद, पीक और पॉप काम करना बंद कर देता है।UITableView कक्षों पर पीक और पॉप UISearchController

मैं एप्पल के 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

सबसे पहले, अपनी 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) 
    } 
} 

जब इस समाधान का परीक्षण, मैं एक अजीब समस्या दिखाई दी, कि परिणाम सेट में पहली पंक्ति 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 कि बातचीत के लिए sourceView था के बजाय MainTableViewController पर 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

यह तब तक ठीक काम करता है जब तक आपके पास एक अलग खोज ResultsController है। हालांकि, यदि आप खोज परिणामों को दिखाने के लिए टेबल व्यू कंट्रोलर का उपयोग करते हैं, तो searchController.searchResultsController शून्य है (एप्पल दस्तावेज़ों के अनुसार: "searchResultsController: दृश्य नियंत्रक जो खोज परिणामों को प्रदर्शित करता है। यदि आप खोज परिणामों को प्रदर्शित करना चाहते हैं तो शून्य निर्दिष्ट करें वही दृश्य नियंत्रक जो आपकी खोज योग्य सामग्री प्रदर्शित करता है।" –

संबंधित मुद्दे