私はSwiftのコアデータを初めて使用しており、NSPredicateを使用してヘルプが必要です。私は現在、私のアプリでテーブルビューと検索バーを持っています。私はまた、アレルゲン(文字列)の属性を持つItemというエンティティを持っています。 searchBar.textがItem.allergenと等しい場合にのみセルが表示されるように、このテーブルビューをフィルタリングします。NSPredicateを使用してテーブルビューでコアデータを並べ替える(Swift)
func attemptFetch() {
let fetchRequest: NSFetchRequest<Item> = Item.fetchRequest()
let dateSort = NSSortDescriptor(key: "created", ascending: false)
let titleSort = NSSortDescriptor(key: "title", ascending: true)
if segment.selectedSegmentIndex == 0 {
fetchRequest.sortDescriptors = [dateSort]
} else if segment.selectedSegmentIndex == 1 {
fetchRequest.sortDescriptors = [titleSort]
} else {
if searchBar.text != nil, searchBar.text != ""{
print("Search bar text exists")
print(searchBar.text!)
fetchRequest.sortDescriptors = [titleSort]
//Search; Only display cell if searchBar.text = Item.allergen
} else {
print("Search bar text does not exist!")
fetchRequest.sortDescriptors = [titleSort]
}
}
let controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
controller.delegate = self
self.controller = controller
do {
try controller.performFetch()
} catch {
let error = error as NSError
print("\(error)")
}
}
これを実行するためにNSPredicateを使用しようとしましたが、エンティティエラーでキーパスが見つかりませんでした。私はこのコードを含めるだろうが、それは完全に間違っていると確信している。
アドバイスはありますか?
更新:
Here's a picture of the Item entity's attributes in the Core Data Model.This is the code in the ItemEntity.swift file, I think this was autogenerated?がうまくいけば、これはあなたが必要なものです。
更新2: ありがとうございました!私は解決策を見つけた。これは私のために働いコードです:
let userSearch = searchBar.text!
commitPredicate = NSPredicate(format: "allergen == %@", userSearch)
fetchRequest.predicate = commitPredicate
ここにアイテムクラスを掲載することはできますか?クラスのプロパティを見たい。 – Aks
関連はありませんが、常に新しいフェッチ結果コントローラを作成するのはなぜですか? 'sortDescriptors'プロパティを追加し、' didSet'オブザーバを使ってコントローラの述語の 'sortDescriptors'を更新し、フェッチを実行します。 – vadian
セグメント化されたコントローラが選択されているときにオブジェクトをソートしますか? – Mannopson