1

多くの異なるコンテキストで同じボタンのグループを含むアプリを作成しています。ボタンは、コンテキストごとに異なるオブジェクトにアクションを送信します。ボタンを含む単一の NSView を IB で設計し、リンクを維持しながらペン先の多くの場所にそのビューのコピーを配置できるようにして、変更が反映されるようにしたいと考えています。これらの各インスタンスを異なるオブジェクトに接続し、ボタンのアクションを親ビューが接続されているオブジェクトに送信したいと思います。

NSView のサブクラスを作成することを考えました。ロードされると、nib ファイルからロードされる別のビューに置き換えられ、接続されたオブジェクトがファイルの所有者として設定されますが、これが最もクリーンな方法であるとは確信していません。これがそのアイデアの私の実装です(これは機能します):

@implementation AVNViewFromNib

- (void)awakeFromNib
{
    //Load the nib whose name is specified by the "nibFile" key
    NSNib* viewNib = [[NSNib alloc] initWithNibNamed:[self valueForKey:@"nibFile"] bundle:[NSBundle mainBundle]];
    NSMutableArray* topLevelObjects = [NSMutableArray new];
    [viewNib instantiateNibWithOwner:relatedObject topLevelObjects:&topLevelObjects];

    //Find our replacement view in that nib
    for (id currentObject in topLevelObjects)
    {
        if ([currentObject isKindOfClass:NSClassFromString(@"AVNReplacementView")])
        {
            representedView = currentObject;
            break;
        }
    }

    //Copy appropriate properties from us to our representedView
    [representedView setAutoresizingMask:[self autoresizingMask]];
    [representedView setFrame:[self frame]];
    [[self superview] addSubview:representedView];

    //We were never here. :)
    [self removeFromSuperview];
    [viewNib autorelease];
}

@end

@implementation AVNReplacementView
@end

それは最もクリーンな方法ですか?これについて標準的な方法はありますか?

4

1 に答える 1

1

IBでボタンを含むビューを作成し、そのビューをライブラリウィンドウにドラッグして保存できます。キャッチは、それらの間に「リンク」がないということです。1つを編集しても、他については何も変更されません。

それが必要な場合は、代わりにNSViewのサブクラスを作成する必要があります。

NSViewのサブクラスを作成することを考えました。これは、読み込まれると、nibファイルから読み込む別のビューに置き換えられ、接続されたオブジェクトをファイルの所有者として設定しますが、これが最もクリーンな方法であるとは確信していません。

それはうまくいくかもしれません。そんなに汚いとは思いません。メソッドがオブジェクトを返す理由は、initメソッドが明示的に別のオブジェクトを返すことができるためです。ただし、ロードされたビューにはペン先にあるフレームが含まれるため、さまざまなフレームのビューをどのように処理するかはわかりません。

別の方法は、ペン先からボタンをロードすることですが、サブビューとして追加する前に、フレームを調整する必要があります。

于 2010-02-23T17:09:48.570 に答える