2017-07-07 5 views
1

テーブルビューと検索バーがプログラムで追加されています。フィルタリングされた結果を表示したいので、todoアクティビティのタイトルが含まれている配列(todoTitleという名前)を作成しました(別のオブジェクトがあり、そのプロパティの1つがtitleです)。私はupdateSearchResultsメソッドを使用し、その中でフィルタメソッドを使用して、正しいtodosを返します。配列が空でないことを確認するために、各配列の内部にtodosを出力するコードを関数の中に記述します。ここupdateSearchResultsの内側に私のコードがある(のために:)機能フィルタリングされた配列が空である理由は誰にでも分かりますか?

//filtering through todos' titles 
    filteredTodos = self.todosTitle.filter({ (title: String) -> Bool in 
     if title.lowercased().contains((self.searchController.searchBar.text?.lowercased())!) { 
      return true 
     } else { 
      print ("S \(todosTitle)") 
      print ("t \(title)") 
      print (filteredTodos) 

      return false 

     } 
    }) 
    //updating the results TableView 
    self.resultsController.tableView.reloadData() 

} 

``

todosTitle配列が空ではないので、私のfilteredTodosが空である理由私は理解していません。誰にもこのようなことが起こる理由は何ですか?

+1

から期待した文字列を取得していることを確認するために、検索テキストのあなたの割り当てを分離。 –

+0

self.searchController.searchBar.textを出力する必要がありますか?コンソールとチェック。それは別のことになるだろう、それは理由かもしれない。 – adev

+0

'filteredTodos'はフィルタが返るまでの結果で設定されません。 – PeejWeej

答えて

0

Todoアイテムのタイトルに検索テキストが含まれているかどうかを確認するだけです。以下は、文字列と検索テキスト文字列でテストした簡単な例です。おそらく、あなたはクロージャ内の結果の配列 `filteredTodos` * *はあまり意味がありません印刷searchBar.text

let todosTitle = ["One", "Two", "Three"] 
let searchText = "t" 

//filtering through todos' titles 
let filteredTodos = todosTitle.filter({ (title: String) -> Bool in 
    return title.lowercased().contains(searchText.lowercased()) 
}) 

print(filteredTodos) //["Two", "Three"] 
+0

同じことをしますが、リテラル文字列を使用する代わりに、searchBarのテキストを使用します。私はチェックし、上のメソッドでは、私のtodosTitle配列は空ではないので、私はいくつかの値を追加するコードの他の部分はちょうど良い(私はそうだと思う)です。問題は、フィルタメソッドが私のtodosTitle配列が空でないことを(なぜなら、上記のメソッドのprint()関数は配列に含まれるすべてのオブジェクトを出力します)表示されないことがわかりません。 – Tigran

+0

私のクロージャーから "title"プロパティを印刷しても、todosTitle配列のすべての項目が出力されるため、空ではありません。 – Tigran

+1

フィルタ処理された配列は、クロージャが完了するまで割り当てられません。 – myuiviews

関連する問題