2017-10-08 15 views
1

私は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 
+0

ここにアイテムクラスを掲載することはできますか?クラスのプロパティを見たい。 – Aks

+0

関連はありませんが、常に新しいフェッチ結果コントローラを作成するのはなぜですか? 'sortDescriptors'プロパティを追加し、' didSet'オブザーバを使ってコントローラの述語の 'sortDescriptors'を更新し、フェッチを実行します。 – vadian

+0

セグメント化されたコントローラが選択されているときにオブジェクトをソートしますか? – Mannopson

答えて

0

は正確に検索テキストと一致したものだけをフィルタリングするために、次の述語を追加します。

また
fetchRequest.predicate = NSPredicate(format:"allergen == %@", searchBar.text) 

allergen文字列が含まれている場合、一致する場合があります検索テキスト:

fetchRequest.predicate = NSPredicate(format:"allergen CONTAINS %@", searchBar.text) 

は、比較ケースと小文字を区別しない発音区別符号を作る[cd](そう... ==[cd] ...追加するにはO r ... CONTAINS[cd] ...)。

+0

これはうまくいった!ありがとう! – Thejm

関連する問題