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