4

NSCollectionView の作成に成功し、IB のビュー プロトタイプにラベルを追加して、表現されたオブジェクトのプロパティにバインドしました。ここで、NSTextField を自分の表現するオブジェクトのプロパティにバインドして、プログラムで NSButton と NSTextField を作成したいと考えています。ボタンをクリックすると、NSTextField を表示および非表示にしたいと考えています。

私が遭遇した問題は、コントロールの初期化コードをビューの initWithCoder メソッドに配置し、バインディングをビューの awakeFromNib に配置すると、バインディングが接続されないことです。コントロールの初期化をawakeFromNibに入れると、ボタンがクリックされたときに、ビュー内のコントロールにアクセスできなくなります(NSLogを使用して印刷するとnullになります)。

私が言えることから、問題は NSCollectionView の動作方法である可能性があり、ビューのインスタンスを作成し、コレクションビューにあるオブジェクトの数ごとにそれをコピーします。ボタンを初期化し、バインディングをプロトタイプのコピーで動作させるにはどうすればよいですか?

以下は、サブクラス化されたビューのawakeFromNibでの初期化コードとバインディングです。

SubView.h

@interface SubView : NSView {
    NSButton *button;
    NSTextField *textField;
    IBOutlet NSCollectionViewItem *item; // Connected in IB to my NSCollectionViewItem
}

- (IBAction)buttonClicked:(id)sender;

@end

SubView.m

@implementation SubView

- (id)initWithCoder:(NSCoder *)decoder
{
    id view = [super initWithCoder:decoder];

    button = [[NSButton alloc] initWithFrame:NSMakeRect(50, 95, 100, 20)];
    [button setTitle:@"Begin Editing"];
    [button setTarget:self];
    [button setAction:@selector(buttonClicked:)];
    [self addSubview:button];

    textField = [[NSTextField alloc] initWithFrame:NSMakeRect(10, 10, 100, 75)];
    [self addSubview:textField];

    return(view);
}

- (void)awakeFromNib
{   
        // Bind the textField to the representedObject's name property
        [textField bind:@"value" 
       toObject:item 
        withKeyPath:@"representedObject.name" 
        options:nil];
}

- (IBAction)buttonClicked:(id)sender
{
    [button setTitle:@"End Editing"];
    [textField setHidden:YES];
}

@end
4

3 に答える 3

12

これは私がやったことに似ているように聞こえるので、おそらく必要なものです。

NSCollectionViewをサブクラス化し、オーバーライドします。

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object

newItemForRepresentedObject:、ビュー アイテムを取得し、コントロールとプログラム バインディングを追加します。

@implementation NSCollectionViewSubclass

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object {

    // Allow the superclass to create or copy the collection view item
    NSSCollectionViewItem *newItem = [super newItemForRepresentedObject:object];

    // Get the new item's view so you can mess with it
    NSView *itemView = [newItem view];

    //
    // add your controls to the view here, bind, etc
    //

    return newItem;
}

@end

うまくいけば、これはあなたがいる必要がある場所に近い場所です...

于 2009-08-27T17:30:27.653 に答える
-1

-awakeFromNibプロトタイプNSCollectionViewItemからコピーされたビューに対しては呼び出されません。バインディングコードを入れれinitWithCoder:ば大丈夫です。

于 2009-07-31T03:25:44.137 に答える