首页 > 解决方案 > 坚持通过 FetchedResultsController、Diffable Data Sources 和 CollectionView 添加搜索

问题描述

我有一个 UICollectionView,我正在尝试让搜索栏在其中工作。我已经让酒吧出现了,但我还没有弄清楚在哪里调用我创建的函数,我觉得有点愚蠢(已经做了几个小时,可能是循环的)。我目前正在使用 diffable 数据源和 NSFetchedResultsController 来尝试执行我的搜索。这是我的代码:

我的功能建立我的fetchedResultsController并将其放置在viewDidLoad

func setupFetchedResultsController() {
    let request = NPCData.createfetchRequest()
    request.fetchBatchSize = 30

    if !currentSearchText.isEmpty {
             request.predicate = NSPredicate(format: "title CONTAINS[c] %@ OR body CONTAINS[c] %@", currentSearchText, currentSearchText)
         }

    let sort = NSSortDescriptor (key: "title", ascending: true)
           request.sortDescriptors = [sort]


    fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: container.viewContext, sectionNameKeyPath: nil, cacheName: nil)
    fetchedResultsController.delegate = self

    do {
        try fetchedResultsController.performFetch()
        setupSnapshot()
    } catch {
        print ("Fetch failed")
    }
}

我的代码建立我的搜索栏和搜索控制器:

private func setupSearchController() {
    let searchController = UISearchController(searchResultsController: nil)
    searchController.searchResultsUpdater = self
    searchController.obscuresBackgroundDuringPresentation = false
    searchController.searchBar.placeholder = "Search"
    navigationItem.searchController = searchController
}


func updateSearchResults(for searchController: UISearchController) {
    guard let text = searchController.searchBar.text else { return }
    currentSearchText = text
    setupFetchedResultsController()
}

我还在var currentSearchText = ""UICollectionView 类的顶部放置了一个变量,并且该类遵守NSFetchedResultsControllerDelegate, UISearchResultsUpdating协议。

我正在打电话setupFetchedResultsController()setupSearchController()在我的viewDidLoad.

我在这里想念什么?搜索栏出现了,但是我搜索的任何内容都没有做任何事情,我希望它会更改我的收藏视图以仅显示我正在搜索的结果(如果我搜索“Sportscar”这个词,那么它应该只显示显示单词“Sportscar”的单元格,也不区分大小写)。

标签: iosswiftxcode

解决方案


从 UISearchBar Delegate 方法调用您的更新方法

    func searchBar(_ searchBar: UISearchBar, 
              textDidChange searchText: String)
{
   //search in database using SearchText and update your view accordingly

}

不要忘记将 UISearchBar 实例的委托设置为 self。

希望有帮助。


推荐阅读