30269


SwiftでRealmを使ってデータベースに文字を保存し、テーブルビューで表示をすることまではできたのですが、searchbarを使って検索で一部一致したらテーブルビューに反映するためにはどうしたらいいでしょうか。  
Todoリストのようなものを下記のサイトを手本にしてつくっている感じです。  
ネットを探すと検索条件をResults().filter(_:...)メソッドでオブジェクトを取得してるのを多く見ますが、サーチバーで記入した文字をどのようにfilterで記述するのか、またそれをテーブルビューに反映させるにはどうしたらいいのか、わからないところが多々あります。

理解が乏しい部分も多いと思いますが、考え方を教えていただければ幸いです。

<http://qiita.com/g08m11/items/8d4f7e82e89195ff301c>


CC BY-SA 3.0
2016-11-07T12:33:05.447
30190
2016-11-09T11:50:08.097
2016-11-09T11:43:39.107
5519
19435
question
swift realm
SearchBarから入力したテキストに部分一致したデータを表示したい


まず、手本としている記事のコードは`toDoItems`を計算済みプロパティとしてるのがよくないです。Realmの`Results`は自動的に最新の状態に更新されるので、検索条件が同じなら毎回取得する必要はありません。

下記のコードでは`var toDoItems: Results<ToDo>?`を通常のプロパティに直しました。

Realmのデータを条件で絞り込むには`filter()`メソッドを利用します。  
検索バーに入力された文字列を使って部分一致で検索するには`BEGINSWITH`（前方一致）、`ENDSWITH`（後方一致）、`CONTAINS`（部分一致）を使います。

[code]

    toDoItems = realm
        .objects(ToDo)
        .filter("name BEGINSWITH %@", searchText)
    
[/code]

上記は`ToDo`のオブジェクトを`name`プロパティの前方一致で検索する例です。

UISearchBarの入力をトリガーにして検索を実行し、画面に反映するには、UISearchBarDelegateのテキストが入力されたら呼ばれるメソッドで処理をします。  
TableViewのデータソースに使っている`Results`オブジェクトを、入力された文字列を使って検索したものに更新し、表示に反映させるためにTableViewをリロードします。

下記はコードの例です。

[code]

    class ViewController: UIViewController, UISearchBarDelegate {
    
        @IBOutlet var todoNameText: UITextField!
        @IBOutlet var tableView: UITableView!
    
        var toDoItems: Results<ToDo>?
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let realm = try! Realm()
            toDoItems = realm.objects(ToDo)
        }
    
        func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
            let realm = try! Realm()
    
            if searchText.isEmpty {
                toDoItems = realm.objects(ToDo)
            } else {
                toDoItems = realm
                    .objects(ToDo)
                    .filter("name BEGINSWITH %@", searchText)
            }
    
            tableView.reloadData()
        }
    }
    
[/code]


CC BY-SA 3.0
2016-11-09T11:50:08.097
30269
2016-11-09T11:50:08.097
5519
30190
answer