2017-04-23 3 views
2

私はスタジオの配列を持っています。各スタジオには、studioNameというプロパティがあります。NSPredicateでプロパティにあるオブジェクトのフィルタ配列

スタジオをフィルタリングするにはsearchfieldが必要です。スタジオ名に基づいて、ユーザーが検索フィールドに適用します。

は、ここに私の現在のコードです:それはちょうどワイトを働いていない

var studios = [Studio]() 
var filteredStudios = [Studio]() 
var studiosToDisplay = [Studio]() 

func updateSearchResultsForSearchController(searchController: UISearchController) { 
    let searchText = searchController.searchBar.text 

    print("SEARCH TEXT: \(searchText)") 

    if searchText == nil || searchText!.isEmpty { 
     studiosToDisplay = studios 
     self.resultTableView.reloadData() 
     NSNotificationCenter.defaultCenter().postNotificationName("showResultsBeforeSearchingNotification", object: nil) //Calls SearchVC 
    } else { 
     studiosToDisplay.removeAll() 
     let searchPredicate = NSPredicate(format: "studioName CONTAINS[c] %@", searchText!) 
     let array = (self.studios as NSArray).filteredArrayUsingPredicate(searchPredicate) 
     studiosToDisplay = array as! [Studio] 
     self.resultTableView.reloadData() 
    } 
} 

、今..それはフィルタが、私は関係なく、私がsearchfieldに入れて何を、それぞれの時間を残していない同じメーカーで終わります。

私は述語を知るようにする必要があると思います。そのたびに、配列内の単一のオブジェクトを見る必要があります。しかし、私はどのように把握することはできません。 フォーマットに「ANY」を追加しようとしましたが、それは私のアプリをクラッシュさせます。

+0

スウィフト2を使用していると思われるので、適切に質問にタグを付ける必要があります(私は、あなたのXcodeをAPPストアで入手できる最新のXcodeにアップデートすることをお勧めします) –

+0

サイドノートで: 'searchText == nil' ( 'searchText!')は本当に悪い練習です – Alexander

答えて

7

これは不必要に複雑です。 NSPredicateの必要はありません。

var studios = [Studio]() 
var filteredStudios = [Studio]() 
var studiosToDisplay = [Studio]() 

func updateSearchResultsForSearchController(searchController: UISearchController) { 
    let searchText = searchController.searchBar.text 

    print("SEARCH TEXT: \(searchText)") 

    if let searchText = searchText, !searchText.isEmpty { 
     studiosToDisplay = studios.filter{ $0.studioName.contains(searchText) } 
    } 
    else { 
     studiosToDisplay = studios 
     NSNotificationCenter.defaultCenter().postNotificationName("showResultsBeforeSearchingNotification", object: nil) //Calls SearchVC 
    } 

    self.resultTableView.reloadData() 
} 
1

@Alexanderのおかげで...ここに私が使用して終了コードがあります:

func updateSearchResultsForSearchController(searchController: UISearchController) { 

    let searchText = searchController.searchBar.text 

    if let searchText = searchText { 
     if !searchText.isEmpty { 
      self.studiosToDisplay = self.studios.filter { $0.studioName!.containsString(searchText) } 
      for studio in self.studiosToDisplay { 
       print("\(studio.studioName!)") 
      } 
     } 
     else { 
      self.studiosToDisplay = self.studios 
      NSNotificationCenter.defaultCenter().postNotificationName("showResultsBeforeSearchingNotification", object: nil) // Calls SearchVC 
     } 
    } 

    self.resultTableView.reloadData() 

} 

私はNSPredicateと私の元のコードは、実際に機能したことを、考え出した - 私は間違っを提示しました。私のテーブルビューの配列。..おっと。しかし、今、それは動作し、私はより単純なコードに固執する。どうして私が$ 0関数を使用することを考えなかったのか分からない:) ..とにかく、ありがとう!

+0

ガードステートメントを使用して、余分なレベルのインデントなしで 'searchText'をバインドすることができます – Alexander

関連する問題