gpt4 book ai didi

iphone - 使用 Swift 过滤 UISearchBar 的核心数据

转载 作者:可可西里 更新时间:2023-11-01 00:53:34 24 4
gpt4 key购买 nike

我有一个 UISearchBar,它连接到一个由 Core Data 填充的 TableView 。我在过滤工作时遇到了很多麻烦。大多数关于此的教程都非常陈旧,对我没有用。我正在考虑将实体转换为数组并对数组进行过滤,但我读到那是低效的。我在想我应该使用 NSPredicate,但老实说我不知道​​该怎么做。有任何想法吗?谢谢。

最佳答案

我实际上一直在做这个演示,我刚刚把它放在 GitHub 上。可以查到here.就其实现而言,您必须为您的类设置 UITableViewControllerNSFetchedResultsControllerUISearchDisplayDelegate:

class ContactsViewController: UITableViewController, NSFetchedResultsController, UISearchDisplayDelegate {
}

有了这个,就会有两个 TableView :

  • 来自 tableViewController 的 tableView (self.tableView)
  • 来自 searchDisplayController 的 tableView (searchDisplayController?.searchResultsTableView)

    您还为 fetchedResultsControllersearchResultsControllerappDelegatemanagedObjectContext 创建了类变量:

    let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate

    var managedObjectContext: NSManagedObjectContext? {
    get {
    if let delegate = appDelegate {
    return delegate.managedObjectContext
    }
    return nil
    }
    }

    var fetchedResultsController: NSFetchedResultsController?
    var searchResultsController: NSFetchedResultsController?

    viewDidLoad() 中,您必须为您的 searchResultsTableView 注册您的单元格,因为它不存在于界面中:

    searchDisplayController?.searchResultsTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "CellID")

    您也可以在这里设置您的 fetchRequest:

    fetchedResultsController = NSFetchedResultsController(fetchRequest: someFetchRequest, managedObjectContext: managedObjectContext!, sectionNameKeyPath: nil, cacheName: nil)
    fetchedResultsController?.delegate = self
    fetchedResultsController?.performFetch(nil)

    您将需要一个函数来返回您需要的 FRC,具体取决于 tableView。你让这个函数返回一个 NSFetchedResultsController 并且你将在所有你从 FRC 中提取数据的 TableView 函数中使用它,例如 cellForRowAtIndexPath: 因为它会让你正确的数据集

    func fetchedResultsControllerForTableView(tableView: UITableView) -> NSFetchedResultsController? {
    return tableView == searchDisplayController?.searchResultsTableView ? searchResultsController? : fetchedResultsController?
    }

    最后,您需要实现 searchDisplayControllerWillUnloadSearchResultssearchDisplayControllerShouldReloadTableForSearchString:

    func searchDisplayController(controller: UISearchDisplayController, willUnloadSearchResultsTableView tableView: UITableView) {
    searchResultsController?.delegate = nil
    searchResultsController = nil
    }

    func searchDisplayController(controller: UISearchDisplayController!, shouldReloadTableForSearchString searchString: String!) -> Bool {

    let firstNamePredicate = NSPredicate(format: "nameFirst CONTAINS[cd] %@", searchString.lowercaseString)
    let lastNamePredicate = NSPredicate(format: "nameLast CONTAINS[cd] %@", searchString.lowercaseString)
    let predicate = NSCompoundPredicate.orPredicateWithSubpredicates([firstNamePredicate!, lastNamePredicate!])

    searchResultsController = NSFetchedResultsController(fetchRequest: someOtherFetchRequestWithPredicate(predicate), managedObjectContext: managedObjectContext!, sectionNameKeyPath: nil, cacheName: nil)
    searchResultsController?.performFetch(nil)

    return true
    }

    如果您在填写其他内容时遇到任何问题,例如数据模型或 NSFetchedResultsControllerDelegate 方法,请查看 demo !

  • 关于iphone - 使用 Swift 过滤 UISearchBar 的核心数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27405855/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com