Swift 使用 NSFetchedResultsController 和 UISearchBarDelegate

2024-02-22

我正在寻找解决这个问题的好方法。我想在我拥有的 TableView 上实现一些简单的搜索功能。

我发现的所有示例都使用已弃用的UISearchDisplayController或使用新的UISearchController但没有NSFetchedResultsController目前使用的是Core Data / NSFetchedResultsController

到目前为止,我已经成功地达到了可以收集用户搜索字符串的程度(哇!)。我知道我可能需要一个单独的FRC执行搜索,但如上所述,到目前为止所有尝试都失败了。

我的班级符合以下协议:

class JobListController: UIViewController, UITableViewDelegate, UITableViewDataSource, NSFetchedResultsControllerDelegate, UISearchBarDelegate{

我不能使用UITableViewController因为我已经编写了大量依赖于此类的现有功能UIViewController我有我的两个IBOutlets:

@IBOutlet var tblJobs : UITableView!
@IBOutlet weak var searchBar: UISearchBar!

和我的空数组来保存我的各种Core Data点点滴滴:

var workItems = [Work]()
var filteredWorkItems = [Work]()

这是我初始化的方式FRC,连同我的MOC我在空虚的时刻离开了FRC因为我很确定在某个时候会需要它:

  let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

lazy var fetchedResultsController: NSFetchedResultsController = {
    let workFetchRequest = NSFetchRequest(entityName: "Work")
    let primarySortDescriptor = NSSortDescriptor(key: "createdDate", ascending: true)
    let secondarySortDescriptor = NSSortDescriptor(key: "town", ascending: true)
    workFetchRequest.sortDescriptors = [primarySortDescriptor, secondarySortDescriptor]

    let frc = NSFetchedResultsController(
        fetchRequest: workFetchRequest,
        managedObjectContext: self.managedObjectContext!,
        sectionNameKeyPath: "createdDate",
        cacheName: nil)

    frc.delegate = self


    return frc
    }()

var searchResultsController: NSFetchedResultsController?

In my viewDidLoad函数我正在为我的表和搜索栏设置代表/数据源:

  tblJobs.delegate = self
  tblJobs.dataSource = self
  searchBar.delegate = self

这是searchBar这就是我要做的功能。这stringMatch变量是之前尝试的剩余部分,我希望能够在这里通过多种不同的参数进行搜索,但如果我只能得到一个工作,这将是一个坚实的开始。

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
    println("Search text is \(searchText)")
    self.filteredWorkItems = self.workItems.filter({( work: Work) -> Bool in
        //
        let stringMatch = work.postcode.rangeOfString(searchText)
        return stringMatch != nil
    })

    if(filteredWorkItems.count == 0){
        searchActive = false;
    } else {
        searchActive = true;
    }
    self.tblJobs.reloadData()
}

这是我的cellForRowAtIndexPath函数来显示我如何从fetchedResultsController

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
    let cell =  self.tblJobs.dequeueReusableCellWithIdentifier(
        "JobCell", forIndexPath: indexPath)
        as! JobTableViewCell

    let workItem = fetchedResultsController.objectAtIndexPath(indexPath) as! Work



 //...

    return cell
}

所以你可以看到我这里发生了一些事情,最终我想弄清楚如何使用我新得到的searchText用于查询 my 的字符串FRC,然后在视图中正确过滤结果。

Update:

我尝试将搜索字符串添加到我的NSPredicate in the FRC像这样:

lazy var fetchedResultsController: NSFetchedResultsController = {

   ../


    workFetchRequest.predicate = NSPredicate(format:"title contains[cd] %@", savedSearchTerm!)

   //...
    return frc
    }()

这导致'JobListController.Type' does not have a member named 'savedSearchTerm'

在我的班级顶部,我将其设置如下:

var savedSearchTerm: NSString?

所以不确定我做错了什么?


从您的代码来看,我假设您想使用same表视图显示结果。因此,您只需根据搜索词使用新的过滤器更新您的 FRC 即可。

将搜索词存储在变量中。在 FRC 工厂函数中,包含谓词,如下所示:

request.predicate = searchText?.characters.count > 0 ?
 NSPredicate(format:"title contains[cd] %@", searchText!) : nil

当文本更改时,重置 FRC 并重新加载。

fetchedResultsController = nil
tableView.reloadData()

如果您有其他过滤器(例如范围按钮),请向谓词添加其他术语。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 使用 NSFetchedResultsController 和 UISearchBarDelegate 的相关文章

随机推荐