14

画像をパターンとして描画するために、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
}

残念ながら、イメージバインディングは Interface Builder に表示されません。

Interface Builder でバインディングを公開するには、本当に IBPlugin を作成する必要がありますか? これは、再利用する予定のないカスタム ビューにはやり過ぎのように思えます。

4

4 に答える 4

14

タイトルへの回答: いいえ、IB プラグインなしで (コードで実行することにより) カスタム ビューをバインドできます。
質問本文の質問への回答: はい、IB でバインディングを公開するには IB プラグインが必要です。

あなたのコードは、Interface Builder に入れなければ Interface Builder 内では実行されず、そのexposeBinding:メッセージがあなたのコードです。したがって、Interface Builder に入れる必要があります。つまり、IB プラグインを作成するということです。

また、IB プラグインは古い IB パレットと同じではありません。プラグインは IB 3 を必要とし、作成がはるかに簡単です。パレットは IB 2 を必要とし、作成するのに苦労しました。

于 2009-03-03T19:59:23.623 に答える
2

いいえ、この方法を使用できます

bind:toObject:withKeyPath:options:

プログラムでバインディングを確立します。バインディングをInterfaceBuilderに表示するには、IBパレットを作成する必要があると思いますが、再利用するつもりのない1回限りのクラスの場合、気にすることはありません。

于 2009-03-03T14:33:07.417 に答える
2

バインドを手動で行うことができれば、多くの時間を節約できます。カスタム IB パレットの作成は、数行の手動バインディング コードに比べて大変な作業です。ただし、カスタム IB パレットが必要な場合は、まず NSView サブクラスに必要なものをコーディング的に検討することから始めます。探し始めるのに最適な場所は、バインディングに関する Crawford の Web サイトです。

http://homepage.mac.com/mmalc/CocoaExamples/controllers.html

私は過去数年間、これをよく使用してきました。カスタム IB パレット オブジェクトと一般的なバインドの問題に大いに役立ちました。彼のサイトには、カスタム バインディングを使用したカスタム NSView の詳細を具体的に説明している例があります。

他に注意すべき点は、カスタム ビューが Interface Builder 環境でも機能する必要があることです。カスタム NSView オブジェクトのバインディング コードにいくつかの小さな修正を加えて、Interface Builder で適切に機能し、バインドできるようにする必要があります。これらの詳細は、Crawford のサイトにも記載されています。

http://homepage.mac.com/mmalc/CocoaExamples/controllers.html#ibBindings

于 2009-03-03T16:46:58.360 に答える