作为 iOS 开发课程作业的一部分,我的任务是向用 Swift 编写的 Core Data 项目添加 UISearchBar。
我不知道如何让搜索栏将文本与 managedObjectContext 中的对象进行比较。我知道我需要设置一个谓词并可能添加一些变量。让我心碎的是“如何”和“在哪里”。
我认为我需要做什么
managedObjectContext 是在代码中实例化的,并且有一些对象显示在 TVC 中。
我需要设置一个NSPredicate
基于searchBar.text
来搜索managedObjectContext
并将对象转储到filteredNotes
. 这应该不难做到,但我觉得很难。
我遇到的问题:
- 苹果的文档告诉我
UISearchBar
可以做什么,但不告诉我怎么做。 - Apple 的示例代码无法在 Xcode 6.3 中编译(问题部分解决)
更新:要在使用 Xcode 6.3 beta 时将 Apple 网站上的示例代码更新到 Swift 1.2,您可以Edit/Convert
在 Xcode 中单击以更新它。即使代码编译没有崩溃,我仍然在 Apple 的代码上收到控制台错误。
- 现有的如何做到这一点的例子是:
- ...用 Objective-C 和/或编写
- ...用于过滤静态数组和/或
- ...使用不推荐使用的功能
到目前为止我的设置
这篇文章可能是一个 Swift Rosetta Stone,用于UISearchBar
在 Core Data 项目的ViewController
. 感谢您的阅读。如果你有想法,这里是我到目前为止设置的详细信息。
我的核心数据堆栈是AppDelegate.swift
使用“固定代码”设置的。
我的项目设置为Master-Detail ViewController
.
我唯一的NSManagedObject
实体有 4 个属性。
我添加UISearchBarDelegate
到我的“罐头代码”的顶部MasterVC
:
class MasterViewController: UITableViewController, NSFetchedResultsControllerDelegate, UISearchBarDelegate
// These get set up in the canned "TableView" code, which I've left out
var detailViewController: DetailViewController? = nil
var addNoteViewController:AddNoteViewController? = nil
var managedObjectContext: NSManagedObjectContext? = nil
@IBOutlet weak var searchBar: UISearchBar! // <- Search Stuff
var searchActive : Bool = false // <- Property for UISearchBar delegate methods
var filteredNotes:[Note] = [] // <- Property for Notes (my NSManagedObject)
下面是我关于 UISearchBarDelegate 可选方法(和 searchBar)的部分
// UISearchBarDelegate methods
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
searchActive = true;
}
func searchBarTextDidEndEditing(searchBar: UISearchBar) {
searchActive = false;
}
func searchBarCancelButtonClicked(searchBar: UISearchBar) {
searchActive = false;
}
func searchBarSearchButtonClicked(searchBar: UISearchBar) {
searchActive = false;
}
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
filteredNotes = data.filter({ (text) -> Bool in // <- 'data' should be the Note objects in my managed object context
let tmp: NSString = text
let range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
return range.location != NSNotFound
})
if(filteredNotes.count == 0){
searchActive = false;
} else {
searchActive = true;
}
self.tableView.reloadData()
}