2017-09-01 20 views
0

私はテーブルビューに検索バーがありますが、最初に検索バーをクリックすると結果が表示されなくなります。私が別のコントローラにセグをして戻ってくると、検索バーは正常に動作し、バーがクリックされたときのすべての結果が表示されます。ここで検索バーが適切にフィルタリングされていません

はコードです:

@IBOutlet weak var toolTable: UITableView! 
@IBOutlet weak var searchForTool: UISearchBar! 

var searchActive : Bool = false 
{ 
    didSet { 
     if searchActive != oldValue { 
      toolTable?.reloadData() 
     } 
    } 
} 

typealias Item = (data: String, identity: String) 

var filtered: [Item] = [] 
var items: [Item] = [ 
    (data: " Data1", identity: "A"), 
    (data: " Data2", identity: "B") 
] 

override func viewDidLoad() { 
    super.viewDidLoad() 

    toolTable.delegate = self 
    toolTable.dataSource = self 

    searchForTool.delegate = self 

} 

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) { 

    filtered = items.filter { item in 
     item.data.localizedCaseInsensitiveContains(searchText) 
    } 

    searchActive = !filtered.isEmpty 

    self.toolTable.reloadData() 
} 


override func numberOfSections(in tableView: UITableView) -> Int { 

    return 1 
} 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    if(searchActive) { 
     return filtered.count 
    } 

    return items.count 

} 


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomCell 

    if(searchActive){ 
     cell.toolLabel.text = filtered[indexPath.row].data 
    } else { 
     cell.toolLabel.text = items[indexPath.row].data 
    } 

    return cell 
} 

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let vcName: String 
    if searchActive { 
     vcName = filtered[indexPath.row].identity 
    } else { 
     vcName = items[indexPath.row].identity 
    } 
    let viewController = storyboard?.instantiateViewController(withIdentifier: vcName) 
    self.navigationController?.pushViewController(viewController!, animated: true) 

} 

私はそのいくつかの簡単な解決策は、私はちょうどそれを眺めてると確信しています。

ご協力いただければ幸いです。

+2

なぜUISearchControllerを使用していませんか? – matt

+0

これは、検索バーの機能を作成した最初の方法です。 –

+0

これを行うには時間を取るよう説得できますか? UISearchControllerが存在する理由がありますが、これはそれです。 – matt

答えて

1

あなたのコードを読む私はそれを参照してください:searchBarTextDidBeginEditingsearchActiveをtrueに設定します。データはdidSetのコードに従ってリロードされます。 tableView:numberOfRowsInSectionが呼び出され、filtered.countが返されます。空の場合は0です。それが結果が消える理由です。

+0

ああ、私は参照してください。問題を解決する最もクリーンな方法は何ですか?私はいくつかのことを試しましたが、範囲外のエラーからインデックスを取得していました。 –

+1

@SlavictheSlavic 'searchBarTextDidBeginEditing'メソッドを削除しようとする可能性があります。私はここにいる必要があるとは分かりません。動作しない場合は、このプロジェクトの 'SoundListTableViewController'を見てください:https://github.com/nyg/iOSSystemSoundsLibrary。スクリーンショットからもわかるように、 'UISearchController'を使わないで検索バーを使います。 – nyg

+0

searchBarTextDidBeginEditingを削除すると、私は実際にそのトリックを見ることができました。ありがとう! –

関連する問題