3

作为 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()
}
4

0 回答 0