我已经成功创建了一个NSCollectionView,并在IB中的视图原型中添加了一个标签,绑定到我所代表的对象的属性。我现在想以编程方式创建一个NSButton和NSTextField,其中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
答案 0 :(得分: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
希望这是你需要的地方......
答案 1 :(得分:1)
-awakeFromNib
,但如果将视图放在单独的nib中,则会调用它。
-awakeFromNib
答案 2 :(得分:-1)
-awakeFromNib
。将您的绑定代码放在initWithCoder:
中,您应该没问题。