2009-05-24ビューを原図とミキサーに対応させるBezierPathViewを対応させる原図とミキサーのモデルを追加したので、次はビューを原図とミキサーに対応させます。以前はBezierPathViewのサブクラスとしてOscillatorViewとLissajousViewを作っていましたが、LissajousViewはキーパスの設定を行なうメソッドしかありませんでした。キーパスの設定はツールチップの文字列を使って行なうという変則的な事をやっていたのですが、これをやめて外部から設定する様に変更します。したがってMasterMotifViewやMixerViewといったサブクラスを作る必要がなくなりました。OscillatorViewはクリックに応答して選択枠を描画するという独自の機能を持っているので、サブクラス化は必要です。よってOscillatorViewはそのまま残し、キーパスの設定部分のみ変更します。BezierPathViewの初期化方法を変更する第三のプロジェクトでBezierPathViewを作りました。そこではツールチップに設定した文字列の最初の文字でビューの種類を見分け、バインディングに使うキーパスを設定したり、X軸用のビューであるかどうかを設定したりしていました。ツールチップに設定した文字列で設定を変えるという方法はトリッキーな感じがして元々あまり気に入らなかったのですが、それに加えて動作確認中にツールチップがちらついたり、下のウィンドウに配置されたビューのツールチップが表示されてしまったりといった問題も発生してしまいました。そこで初期設定を別の方法で行なう事にしました。これまでは自分の初期化は自分で行なう方針でしたが、これをやめてEnclosureViewに設定してもらう事にします。そこでバインディングに使うキーパスと、X軸用のビューであるかどうかを設定するメソッドsetKeyPath:isXView:を用意します。インターフェイスファイルにメソッドの宣言を追加します。isXView:(BOOL)isX;@endsetKeyPath:isXView:メソッドを実装します。実施している内容は、isXViewフラグの設定と、dataPathのバインディングの設定だけです。".bezierPath"は必ず末尾につくとわかっているので、引数には含めずこのメソッドで付け足す事にしました。stringByAppendingString:@".bezierPath"]options:nil];}以前はawakeFromNibでdataPathのバインディングを設定していましたが、setKeyPath:isXView:メソッドで設定する様に変更したので、その部分を削除します。bind:@"selectionIndexes"toObject:controllerwithKeyPath:@"selectionIndexes"options:nil];}EnclosureViewでBezierPathViewを初期化するEnclosureViewでBezierPathViewを初期化する為にアウトレットを追加、変更します。OscillatorViewは数が二個から六個に増えたので、名称を変更します。lissajousViewを削除して、代わりに原図とミキサーのビューを追加します。viewMasterが原図のビュー、viewXとviewYがそれぞれX軸とY軸のミキサー用のビューです。*)sender;@endawakeFromNibに初期化コードを追加します。ついでにOscillatorViewの選択を明示的に行なう様に変更しました。isXView:NO];}OscillatorViewの変更点OscillatorViewがクリックされてビューの選択が切り替わった時、スライダーやテキストフィールドといった他のビューのバインディングを切替える必要があります。その切替えに自身のキーパスを提供する必要があるので、インスタンス変数を追加してキーパスを保持する様にします。キーパスが"selection.x.osc1.bezierPath"の場合、"selection.x.osc1"がsetKeyPath:isXView:の引数として渡されるので、これを保持します。実際の切替えはEnclosureViewが行ないますので、oscillatorKeyPathメソッドで参照できる様にします。(void)setSelected:(BOOL)isSelected;@endkeyPathメソッドは不要になったので削除します。初期化メソッドとdeallocメソッドを追加します。初期化メソッドではインスタンス変数oscillatorKeyPathの初期値をセットしていますが、何もセットしないと起動時にスライダーやテキストフィールドのバインディングを設定するコードでエラーが発生するので、その対策としてセットしています。deallocメソッドでは保持していたキーパスを解放します。setKeyPath:isXView:メソッドをオーバーライドして、キーパスを保持するコードを追加しています。