【发布时间】:2015-08-18 12:41:08
【问题描述】:
我正在寻找一个体面的解决方案来解决这个问题。我想在我拥有的 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?
在我的 viewDidLoad 函数中,我正在为我的表和 searchBar 设置委托/数据源:
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 字符串来查询我的FRC,然后过滤结果正确地在视图中。
更新:
我尝试将搜索字符串添加到NSPredicate 中的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?
所以不确定我做错了什么?
【问题讨论】:
标签: ios swift core-data uisearchbar