2017-02-13 24 views
14

Peek and Pop, UISearchController ile çalışıyor. Ancak, Peek ve Pop updateSearchResults kullanarak tabloyu aramaya başladığınızda çalışmayı durdurur.UITableView hücreleri üzerindeki Peek and Pop, UISearchController

Ben Apple'ın Table Search with UISearchController demo örnek olarak Peek ve Pop desteklemek için uzattığımızı: enter image description here

Sorun tabloyu aramaya başladığında, Peek ve Pop artık çalışmıyor olduğunu. Sadece seçkin vurgular it:

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

şekilde göz atmak ve pop (hatta klavye olabilir) müdahale arama bağlam kontrolörü mı: Ben MainTableViewController vardı vardır yapılmış enter image description here

güncellemelerini? Tabloyu başlangıçta tüm veriler olduğunda işe yaratabilirim, ancak aramayı kullanmaya başladığımda değil. Çalıştırmak ve sorunu görmek için working sample here ekledim.

+0

Sorununuz nedir? –

+0

Soruları ekran görüntüleriyle ve daha fazla detay ile güncelledim, 0 :) – TruMan1

+0

Gözbebeği ve pop'u engelleyen klavye olmadığını doğrulayabilirim. Onu reddettim ve sorun devam ediyor. – TruMan1

cevap

14

Birincisi, içinde senin MainTableViewController.viewDidLoad() o gözetleme/pop bilgi verilecektir ayrı görünümüdür beri, ayrıca resultsTableController.tableView kayıt gerekir: Bu çözümü test edilirken, Garip bir sorun fark

if traitCollection.forceTouchCapability == .available { 
    previewingContext = registerForPreviewing(with: self, sourceView: tableView) 
    if let resultVC = searchController.searchResultsController as? ResultsTableController { 
     resultVC.registerForPreviewing(with: self, sourceView: resultVC.tableView) 
    } 
} 

, o Sonuç kümesindeki ilk satır görünmez değildi ve WERE sonuç kümesindeki boş satırlar görünebilir. Yani, previewingContext(_:viewControllerForLocation:) ikinci düzeltme: Orijinal kodunda

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

, bunun yerine etkileşim için sourceView oldu tableView ait MainTableViewController üzerine tableView özelliğini kullanıyordu.

Şimdi, bu arama yaparken ve olmadığınızda çalışır. Ancak, arama girdiğinizde, ancak henüz hiçbir arama metni girmediyseniz, UISearchController aktiftir, ancak UITableViewMainTableViewController'dan biridir ve görüntüyü iki kez bir kaynak görünümü olarak kaydedemezsiniz. UISearchController sunulduğunda

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

Temelde, biz MainTableViewController kaydını ve arama denetleyicisi kayıt: Yani, biz yapmak için biraz daha fazla iş var. Görevden alındığında, tersini yaparız.

Bu değişikliklerle, her üç durumda da gözatma ve pop çalışma.

+0

@ TruMan1, cevabım faydalı oldu mu? –

+0

Evet, teşekkürler! Açık ve bütün devletler işe yarar. – TruMan1

+0

Bu, ayrı bir searchResultsController sahip olduğunuz sürece iyi çalışır. Ancak, arama sonuçlarını göstermek için tablo görünümü denetleyicisinin kendisini kullanırsanız, searchController.searchResultsController öğesinin sıfır olduğunu (Elma belgeleri başına göre: "searchResultsController: Arama sonuçlarını görüntüleyen denetleyici. Arama sonuçlarını görüntülemek istediğinizde nil belirtin. Aranabilir içeriğinizi görüntüleyen aynı görünüm denetleyicisi." –