iOS 開発クラスの課題の一環として、Swift で作成された Core Data プロジェクトに UISearchBar を追加する任務を負っています。
テキストを managedObjectContext 内のオブジェクトと比較する検索バーを取得する方法がわかりません。述語を設定し、いくつかの変数を追加する必要があることはわかっています。私を押しつぶしているのは、「方法」と「場所」です。
私がしなければならないと思うこと
managedObjectContext はコードでインスタンス化され、TVC に表示されるオブジェクトがあります。
を検索してにオブジェクトをダンプするには、NSPredicate
に基づいてを設定する必要があります。これはそれほど難しいことではないはずですが、難しいと思います。searchBar.text
managedObjectContext
filteredNotes
私が遭遇した問題:
- Apple のドキュメントには、何
UISearchBar
ができるかが記載されていますが、その方法は記載されていません。 - Apple のサンプル コードが Xcode 6.3 でコンパイルされない(問題は一部解決済み)
更新: Xcode 6.3 ベータ版を使用しているときに、Apple の Web サイトからサンプル コードを Swift 1.2 にEdit/Convert
更新するには、Xcode 内をクリックして更新します。コードはクラッシュせずにコンパイルされますが、Apple のコードでコンソール エラーが発生します。
- それを行う方法の既存の例は次のとおりです。
- ...Objective-C および/またはで記述
- ...静的配列のフィルタリングおよび/または
- ...廃止された機能の使用
これまでの私のセットアップUISearchBar
この投稿は、Core Data プロジェクトの に
を追加するための Swift Rosetta Stone になる可能性がありますViewController
。読んでくれてありがとう。考えがある場合は、これまでにセットアップしたものの詳細を以下に示します。
私の Core Data Stack は、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()
}