バインディングを設定する【実践的Macintoshプログラミング解説】

印刷用表示 |テキストサイズ 小 |中 |大 |

CoreData版 Repeating Motif Generator の開発 Repeating Motif Wonderland CoreData 実践的 Macintosh プログラミング解説

LinkIconホーム

更新日 2009-05-24

テーブルビューにパラメータではなくリサージュ図形を表示する

バインディングを設定する

 NSValueTransformerのサブクラスを作り、そのインスタンスを生成して登録しました。いよいよ最後のステップですが、これは通常のバインディング設定とほとんど変わりません。

テーブルビューにイメージセルをセットする

imageCellInLibrary.png テーブルビューに画像を表示したい場合はイメージセルを使います。Interface BuilderのLibraryパレットにImage Cellがありますので、それを探して下さい。


dragImageCell.png Image Cellアイコンをドラッグして、テーブルビューの先頭カラムにドロップします。

 それ以外のカラムはもう不要なので、削除してしまいます。


tableColumnBinding.png テーブルカラムのバインディングがresolutionに設定されているので、これをbezierPathに変更します。bezierPathはLissajousエンティティの親エンティティであるPathHolderが持つ属性で、Lissajousエンティティの場合リサージュ図形を表すオブジェクトです。

 そしてValue Transformerに先ほど登録したRMGPathToImageを入力すれば、バインディングの設定は完了です。


3rdWindowDesign.png

 テーブルビューが一列になったので、形状が縦長になりました。それに合わせて全体の配置を見直し、右図のようなレイアウトとしました。

 Amplitudeは現時点では設定する意味がないので、ビューを削除しました。


tableViewRowHeight.png テーブルビューを含むスクロールビューの横幅を120としました。そしてテーブルビューのRow Height(行の高さ)を100としました。


addButtonSetting.png Add, Removeボタンはプッシュボタンの形状でしたが、テーブルビューが小さくなったのでSquareにしました。

 最初はタイトルに"+"を指定していたのですが、システムで使われているボタンと異なり、どうも見栄えがよくありません。これはImageにNSAddTemplateを指定する事で解決しました。"-"ボタンはNSRemoveTemplateです。
 他にもシステムで使われているアイコンが多数登録されています。

テーブルビューに図形が一つしか表示されない

3rdAppNG.png 動作確認してみると、特に支障なく動いています。プラスボタンを押してリサージュ図形を新規作成、パラメータを変更するとそれがOscillatorViewとLissajousViewに反映され、同時にテーブルビューの図形にも反映されている。特に問題ありません。

 問題が発生したのは、一度保存したファイルを読み込んだ時でした。右の図がその状態です。リサージュ図形が四つあるのですが、テーブルビューには最初の一つしか表示されません。データ自体はちゃんと存在し、テーブルビューの二番目、三番目をクリックするとリサージュ図形が表示されます。どうも最初の表示がうまくいっていない様です。

 フォールトが関係あるのか?などと関係ない方向に進んだりもしながらも原因がようやくわかりました。LissajousのawakeFromFetchでbezierPath属性を更新していないのがいけない様です。

// 
//  Lissajous.m
//

- (void)awakeFromFetch
{
    [super awakeFromFetch];
    [self updateBezierPath];
}

3rdAppOK.png LissajousにawakeFromFetchを追加し、そこでupdateBezierPathを呼び出したらちゃんと表示される様になりました。

 疑問なのはOscillatorのawakeFromFetchでLissajousのupdateBezierPathを呼び出しているのに、なぜそれではダメなのか?という事です。

 ひょっとしてファイルから読み込まれる順番が不定なので、Oscillatorが存在しているのにLissajousがまだ存在していないという状況があり得るという事なのでしょうか?