我正在寻找解决这个问题的好方法。我想在我拥有的 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?
所以不确定我做错了什么?