QCPatchControllerのコンポジションをプログラムで変更するQuartz Composerを使ったCocoaバインディングのチュートリアルが、『Quartz Composer Programming Guide』の「Publishing Ports and Binding Them to Controls」の章にあり、Interface Builderでバインディングを設定する方法が実例で説明されています。具体的には、「Attributes」のインスペクタパネルを通じて、QCPatchControllerのインスタンスにコンポジションを読み込む方法が示されています。 図1:Interface BuilderのQCPatchControllerのAttributesインスペクタパネル
ただし、(Interface BuilderのTest Interface機能を使用しないかぎり)コンポジションをQCPatchControllerインスタンス内に保存する必要はなく、実行時にホストアプリケーションから読み込んだり置き換えたりすることができます。これを行うには、QCPatchControllerにバインドされたQCViewにコンポジションを読み込みます。それにより、QCPatchControllerの組み込みコンポジションが自動的に更新されます。新たに読み込まれたコンポジションの入力と出力の組み合わせ(タイプとキー)が同じであれば、バインディングは引き続き適切に機能します。 リスト1:QCPatchControllerのコンポジションをプログラムを使って置き換える
NSString* path = [[NSBundle mainBundle] pathForResource:@"MyComposition" ofType:@"qtz"];
/*
「myQCView」QCViewインスタンスの「patch」パラメータがInterface BuilderのQCPatchControllerの
「patch」プロパティにバインドされていると仮定する
*/
if([myQCView loadCompositionFromFile:path]) {
/*
QCPatchControllerのコンポジションがうまく交換され、そのQCViewとバインディングが
更新される
*/
}
else {
/*
ここでエラーを処理する
*/
}
QCPatchControllerを使ってプログラムでバインディングを作成するQCPatchControllerクラスのためのAPIはありませんが、実際にはInterface Builderを使わずに、プログラムでQCPatchControllerインスタンスへのバインディングを作成することが可能です。これによって、たとえば、実行時にユーザインターフェイス要素を作成してバインドすることができます。 まず、QCPatchControllerインスタンスへアクセスするためのアウトレットを、バインディングを設定するクラスのインターフェイスに追加します。 リスト2:サンプルのAppControllerクラスにアウトレットを追加
@interface AppController : NSObject
{
IBOutlet id theController;
}
@end
In Interface Builderでは、このアウトレットをnibファイルのQCPatchControllerインスタンスに接続する必要があります。 図2:AppControllerサンプルクラスのアウトレットをQCPatchControllerインスタンスに接続
次に、�[NSObject bind:toObject:withKeyPath:options:]メソッドを使って、レシーバ(通常はUIコントロール)のパラメータをQCPatchControllerのプロパティの1つにバインドします。このメソッドは、Application Kit Referenceで説明しているNSKeyValueBindingCreation簡易プロトコルの一部です。 注:使用するキーパスは、Interface Builderの「Bindings」インスペクタパネルで使用するものと同じです。ただし、「Controller Key」と「Model Key Path」は「.」で区切って連結します。 リスト3:QCPatchControllerとUIコントロール間のバインドをプログラムを使って作成
NSMutableDictionary* options;
/*
これによって、NSButtonコントロール「myButton」と「Foo」キーで識別される
コンポジションのブール値による入力とのバインディングを作成する
*/
options = [NSMutableDictionary new];
[options setObject:[NSNumber numberWithBool:NO] forKey:@"NSConditionallySetsEnabled"];
[options setObject:[NSNumber numberWithBool:NO] forKey:@"NSRaisesForNotApplicableKeys"];
[myButton bind:@"value" toObject:theController withKeyPath:@"patch.Foo.value" options:options];
[options release];
/*
バインディングは「-unbind:method」を使って破棄できる
*/
[myButton unbind:@"value"];
注:UIコントロールとそのバインディングパラメータのリストは、Cocoa Bindings Referenceに掲載されています。 コンポジションの入力値または出力値が変更されたらバインディングを使って通知するCocoaバインディングメカニズムはキー値コーディング(KVC)とキー値監視(KVO)に依存しており、これらには対応する非形式プロトコル、 NSKeyValueCodingとNSKeyValueObservingがあります。2つのプロトコルについては、Foundation Referenceを参照してください。 KVO APIを直接使用することで、コンポジションの入力値や出力値の変更を監視し、変更されると自動的に通知できます。 リスト4:QCPatchControllerとKVOによってコンポジションの入力値の変更を監視
/*
入力値の変更の監視を開始する
*/
[theController addObserver:self forKeyPath:@"patch.Foo.value" options:0 context:NULL];
/*
オブザーバ(下記自体)は、入力値の変更でKVOによって呼び出される上記の
メソッドを実装する必要がある
*/
- (void) observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object
change:(NSDictionary*)change context:(void*)context
{
// 何かの処理をする
}
/*
入力値の変更の監視を停止する
*/
[theController removeObserver:self forKeyPath:@"patch.Foo.value"];
ドキュメント改訂履歴
掲載日: 2006-03-03 | ||||||||||||
|