カスタムNSViewのバインド:IBPluginの作成が必要ですか?
-
03-07-2019 - |
質問
NSViewのサブクラスを作成して、画像をパターンとして描画します:
@interface CePatternView : NSView
{
NSImage* image;
id observableObjectForImage;
NSString* keyPathForImage;
}
@end
バインディングを公開するために以下を実装しました:
+ (void)initialize
{
// Expose the "image" binding to IB.
[self exposeBinding:@"image"];
}
- (Class)valueClassForBinding:(NSString *)binding
{
if([binding isEqualToString:@"image"])
return [NSImage class];
return nil; // Unknown binding
}
残念ながら、 image バインディングはInterface Builderに表示されません。
Interface Builderでバインディングを公開するために実際にIBPluginを作成する必要がありますか?これは、再利用する予定のないカスタムビューにとってはやり過ぎのようです。
解決
タイトルへの回答:いいえ、IBプラグインなしでカスタムビューをバインドできます(コードで行うことにより)。
質問本文の質問への回答:はい、IBのバインディングを公開するにはIBプラグインが必要です。
Interface Builderに配置しない限り、Interface Builder内でコードは実行されず、その exposeBinding:
メッセージがコードです。したがって、Interface Builderに配置する必要があります。つまり、IBプラグインを作成することを意味します。
また、IBプラグインは古いIBパレットとは異なります。プラグインにはIB 3が必要で、作成がはるかに簡単です。パレットにはIB 2が必要で、作成するのが苦痛でした。
他のヒント
別の標準バインディング(toolTipなど)を使用してコントローラーオブジェクトをビューオブジェクトにバインドし、テキストエディターを使用してXIBファイルを編集し、XMLを手動で変更しました。
その後、バインディングは正常に機能し、Interface Builderに正しく表示されて起動します!
いいえ、メソッドを使用できます
bind:toObject:withKeyPath:options:
プログラムでバインディングを確立します。 Interface Builderでバインディングを表示するにはIBパレットを作成する必要があると思いますが、1回限りのクラスでは再利用するつもりはないので、気にしませんでした。
手作業でバインディングを行うことができれば、時間を大幅に節約できます。数行の手動バインディングコードと比較して、カスタムIBパレットを作成するのは大変な作業です。ただし、カスタムIBパレットが必要な場合は、NSViewサブクラスが必要とするものをコーディングの観点から確認することから始めます。探し始めるのに最適な場所は、バインディングに関するCrawfordのWebサイトです。
http://homepage.mac.com/mmalc/CocoaExamples/controllers.html
私は過去数年にわたってそれを多く使用してきましたが、それは私のカスタムIBパレットオブジェクトと一般的なバインドの問題で大いに役立ちました。彼のサイトには、カスタムバインディングを使用したカスタムNSViewの詳細な例があります。
他に注意すべきことは、カスタムビューもInterface Builder環境で動作する必要があるということです。 Interface Builderで適切に機能し、バインドするように、カスタムNSViewオブジェクトのバインディングコードに配置する必要がある小さな修正がいくつかあります。これらの詳細は、クロフォードのサイトにも記載されています。
http://homepage.mac.com/mmalc/CocoaExamples/controllers .html#ibBindings