我已经成功地创建了一个 NSCollectionView 并向 IB 中的视图原型添加了一个标签,该标签绑定到我表示的对象的一个属性。我现在想以编程方式创建一个 NSButton 和 NSTextField,其中 NSTextField 绑定到我表示的对象的属性。单击按钮时,我想显示和隐藏 NSTextField。
我遇到的问题是,如果我将控件的初始化代码放在视图的 initWithCoder 方法中,并且绑定在视图的 awakeFromNib 中,则绑定不会被连接起来。如果我将控件的初始化放在 awakeFromNib 中,当单击按钮时,我无法访问视图中的控件(使用 NSLog 打印时它们为空)。
据我所知,问题可能在于 NSCollectionView 的工作方式是,它创建视图的一个实例,然后复制它以获取集合视图中每个对象的数量。如何获得要初始化的按钮以及与原型副本一起使用的绑定?
下面是我的初始化代码和我在子类视图的 awakeFromNib 中的绑定:
子视图.h
@interface SubView : NSView {
NSButton *button;
NSTextField *textField;
IBOutlet NSCollectionViewItem *item; // Connected in IB to my NSCollectionViewItem
}
- (IBAction)buttonClicked:(id)sender;
@end
子视图.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