Array Controller Binding 2

Array Controller Binding 1 の続き。長くなりすぎて追加できなかったので、新しいページで。

Table

次に、テーブルと Array Controller をバインドしていく。

それぞれの Key に対応するコラムを選び、Inspector のバインドでバインドしていく。ただし、テーブルには、color の列を作らず、text のテキストに色をつけることにする。基本的な作業は、各パーツをバインドしたときと同じ。

Text

Text は Value で text とバインドする。Continuously Updates Value にチェックを入れておくと、文字列を入力している時点で情報がアップデートされる。

もうひとつ、テキストの色に Color Well の情報を反映させるので、下の方の Text Color を開いてバインドする。このとき Color Well をバインドしたときと同様に Value TransformerNSUnarchiveFromData を選ぶ。

Item は Pop Up Button なので、Selected Index を Check はチェックボックスなので、Value とバインドする。

Item

Check

あとは、Add と Remove ボタンをバインドする。

制御ボタン

ボタンは、その情報を Array Controller に保持するのではなくて、Array Controller を扱うためなので、ちょっとすることが違う。

まずは、追加や削除ができないときには、ボタンが使えないようにするために、AvailabilityEnabled を Array Controller にバインドする。そのとき、Controller Key にはそれぞれ canAdd と canRemove を選ぶ。Model Key Path は設定しなくていい。

Add

Remove

このうち、canRemove にバインドしてあるボタンは、Array Controller がバインドしてあるテーブルの項目が選択されていないと、disable になる(クリックできなくなる)。

つぎに、Add をクリックしたら要素の追加、Remove をクリックしたら要素の削除という動作をしたいので、Array Controller の Received Actions で対応するものと結びつける。

この時点で実行して、要素を加えてそれぞれの項目の値を変えると、それが反映される。ただ、テーブル上の表示の設定をしていないので、Check Box の列には、0、1の値が、item の列には選ばれた項目の Index が入っている。

ここまでできたら、実際使うには都合が悪いので、テーブルにもチェックボックスとポップアップボタンを入れる。

Library の Views & Cells で、TableView の Cell を選んでテーブルの対応した列にドラッグアンドドロップするだけ。 Check Box Cell をチェックボックスを使いたいテーブルの列に、Pop Up Button Cell をポップアップボタンを使いたいテーブルの列にドラッグアンドドロップ。

Pop Up Button Cell の方は、ダブルクリックして対応するポップアップボタンと同じ項目を入れておく。

最終的には、こんな形になってる。

これを実行するとこんな感じ。

というわけで、あとは、Array Controller を User Defaults Controller にバインドして、値を保存するだけなんだけど、ちょっと検索窓の使い方を覚えたのでそれをメモ。

検索窓

Interface Builder の Library から Search Field を選びウィンドウに追加する。

テーブルの右上によくあるので、その辺りに。

これを Array Controller にバインディングする。

Inspector の Search のところで Predicate を開いて、Bind to: に Array Controller を選びチェックを入れる。Display Name のところは虫眼鏡をクリックしたときにでてくるリストに表示される名前。つまり、ここでするのは、何を検索するのかの指定。Predicate Format は検索するもの。keyPath contains $value となっているので、keyPath のところを検索したい key の名前にする。ここでは、text と item という key があるので、text にする場合は次のようになる。

これはいくつでも追加できるので、もし他の検索対象を作りたいときは、すぐ下に現れる Predicate2... で指定していく。ここでは、すべてを検索する All とそれぞれにしぼって検索する Text と Item を作りたいので、3つチェックを入れる。ここでの順番が表示順になるので、それも考慮する。すべてを検索したい場合は、それぞれの検索指定をかっこに入れて or つなげる。All をつくるには Predicate Format を (text contains $value) or (item contains $value) とする。

これを All、Text、Item の順でつくると、虫眼鏡をクリックしたときに次のように表示される。ここでチェックが入っているのが検索対象。

test2 で検索すると、ちゃんと test2 が含まれるものだけが表示される。

User Defaults Controller にバインドする

最後に、Array Controller の値を User Defaults Controller にバインドして、次回起動したときにデータが保持されているようにする。

テーブルなどで保存するデータの量が多いときは、アプリケーションに Core Data のデータベースを追加するのように、Core Data のデータベースとして

テーブルの内容を別ファイルに XML で保存するか、CoreData アプリケーションを作るのように最初から Core Data のアプリケーションとして作った方がいい。

Inspector の Binding にある Controller Content の Content Array で Shared User Defaults Controller にバインドして、

Handle Content As Compound Value にチェックを入れ、Model Key Path の値を入力する。これは、他のものとかぶらなければ何でもいい。

これで、次回起動時に保存されたデータが表示されるはず。