はじめに
Realmで保存してあるデータがTableViewに既に表示されている状態のとき、UISearchBarを用いた検索機能を実現したいと考えている人向けの記事です。Realmをデータベースとして用いたのでこのように謳っていますが、別にRealmじゃなくてもやることは一緒です。
コード
今回はUISearchbarの文字列が変わる度に検索をかけるときを想定しています。
肝心の絞り込みはRealmの.filter関数を用いています。
何を用いてデータを保存しているかに応じてフィルタリングを行うときの関数の形は変わりますが、変わるのはそれだけで、
- 文字列に応じてフィルタリングを行う
- 上記の結果を配列に格納する
- tableViewをリロードする
の手順を踏めばOKです。
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchBar.text?.count == 0 { // 検索されている文字列がない時
configureTableView()
DispatchQueue.main.async {
searchBar.resignFirstResponder()
}
} else {
let realm = try! Realm()
self.itemList = realm.objects(TimeCapsuleModel.self).filter("title CONTAINS[cd] %@", searchBar.text!) //itemListにフィルタリングした結果を格納する
}
tableView.reloadData()
}
func configureTableView() {
let realm = try! Realm()
self.itemList = realm.objects(TimeCapsuleModel.self)
self.tableView.reloadData()
}