集合视图实现问题中的编程搜索栏

问题描述:

我以编程方式实现了我的搜索栏。对于表视图中的默认行为,我设法使其在标题视图中工作。现在,我正在尝试在一个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!) 
    } 
} 

我找到了解决方案,它是如此简单。 我放在一个观点作为支撑,只是增加了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() 
      } 
     } 
    }