2017-08-02 15 views
0

私は検索バーをプログラマチックに実装しました。テーブルビューのデフォルトの動作では、ヘッダビューで動作させることができました。今、私はcollectionViewで同じ実装を試しているし、私はそれを動作させるように見えることはできません。私はかなりの数日間苦労してきたので、それが一致しているすべての助けに感謝します。 私は何か欠けていただく場合には、全体のビューコントローラを掲載しています:私は解決策を見つけたコレクションビューのプログラム検索バーの実装の問題

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

答えて

0

を、そしてそれはとても簡単でした。 私がサポートとしてビューを配置し、ちょうどサブビューとしてsearchControllerを追加しました:

setupNHSTSD.viewForSearch.addSubview(searchController.searchBar) 

あなたはあなただけ使用できる検索バーの背景画像を取り出したい場合:

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