2017-08-02 2 views
0

Ich habe meine Suchleiste programmatisch implementiert. Für das Standardverhalten in einer Tabellenansicht habe ich es geschafft, es in der Header-Ansicht arbeiten zu lassen. Nun, ich versuche die gleiche Implementierung in einer CollectionView und ich kann nicht scheinen, damit es funktioniert. Jede Hilfe, die es verdient, wird geschätzt, da ich jetzt seit einigen Tagen kämpfe. Ich veröffentliche die gesamte View-Controller, falls ich bin etwas fehlt:Programmatische Suchleiste in Sammlungsansicht Implementierungsprobleme

import UIKit 
import Firebase 
import FirebaseDatabase 

class NHSTrustSearchData: UIViewController, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource, UISearchBarDelegate { 

    var setupNHSTSD = SetupNHSTSD() 

    var nhsTrusts = [NhsTrust]() 
    var nhsTrustsFiltered = [NhsTrust]() 

    let searchController = UISearchController(searchResultsController: nil) 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Initialize the window 
     let window = UIWindow.init(frame: UIScreen.main.bounds) 
     window.makeKeyAndVisible() 

     setupNHSTSD.nhsTrustSearchData = self 
     setupNHSTSD.setupViews() 

     setupNHSTSD.collectioViewSetup() 

     setupBasicNavigationForSocialHealthcare() 

     setupNHSTSD.collectionView.dataSource = self as UICollectionViewDataSource 
     setupNHSTSD.collectionView.delegate = self 

     setupNHSTSD.collectionView.register(NHSTrustCell.self, forCellWithReuseIdentifier: "NHSTustCell") 

     setupNHSTSD.searchBar.delegate = self 

     navigationItem.title = "Choose NHS Trust" 
     print("User role remains: \(currentUserRole)") 

     fetchQuestions() 

     searchController.searchResultsUpdater = self as UISearchResultsUpdating 
     searchController.dimsBackgroundDuringPresentation = false 
     definesPresentationContext = true 
     setupNHSTSD.searchBar = searchController.searchBar 

    } 

    func filterContentForSearchText(searchText: String, scope: String = "All") { 
     nhsTrustsFiltered = nhsTrusts.filter { trust in 
      return trust.nhsTrustName.localizedLowercase.contains(searchText.localizedLowercase) 

     } 

     setupNHSTSD.collectionView.reloadData() 
    } 


    func numberOfSections(in collectionView: UICollectionView) -> Int { 
     return 1 
    } 

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     if searchController.isActive && searchController.searchBar.text != "" { 
      return nhsTrustsFiltered.count 
     } 
     return nhsTrusts.count 
    } 

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "NHSTustCell", for: indexPath) as! NHSTrustCell 
     cell.backgroundColor = .white 
     cell.layer.borderColor = UIColor(white: 0.5, alpha: 0.3).cgColor 
     cell.layer.borderWidth = 0.3 

     let trust : NhsTrust 
     if searchController.isActive && searchController.searchBar.text != "" { 
      trust = nhsTrustsFiltered[indexPath.row] 
     } else { 
      trust = nhsTrusts[indexPath.row] 
     } 
     cell.nhsTrustName.text = trust.nhsTrustName 
     return cell 

    } 

} 

extension NHSTrustSearchData: UISearchResultsUpdating { 
    @available(iOS 8.0, *) 
    func updateSearchResults(for searchController: UISearchController) { 
     filterContentForSearchText(searchText: searchController.searchBar.text!) 
    } 

    func updateSearchResultsForSearchController(searchController: UISearchController) { 
     filterContentForSearchText(searchText: searchController.searchBar.text!) 
    } 
} 

Antwort

0

ich die Lösung gefunden, und es war so einfach. legte ich einen Blick als Träger und nur die searchController als Subview hinzugefügt:

setupNHSTSD.viewForSearch.addSubview(searchController.searchBar) 

Wenn Sie das Hintergrundbild des SearchBar nehmen wollen Sie sich entweder nur:

//remove searchBar background image 
    for subView in searchController.searchBar.subviews { 
     for view in subView.subviews { 

      if view.isKind(of: NSClassFromString("UISearchBarBackground")!) { 
       let imageView = view as! UIImageView 
       imageView.removeFromSuperview() 
      } 
     } 
    }