如何在我的NSCollectionView的视图子类中以编程方式绑定?

时间:2009-07-31 02:16:02

标签: objective-c cocoa binding nscollectionview

我已经成功创建了一个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

3 个答案:

答案 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)

如果该视图与NSCollectionView位于同一个nib中,则不会在NSCollectionViewItem的视图上调用

-awakeFromNib,但如果将视图放在单独的nib中,则会调用它。

  • 创建一个空的nib文件(BlahBlahCollectionViewItem.nib)。
  • 中的任何笔尖中剪切集合项目视图
  • 将其粘贴到新的nib文件中
  • 将其所有者的类更改为NSCollectionViewItem。
  • 将所有者的视图插座连接到新粘贴的视图
  • 打开包含NSViewController的nib文件
  • 选择关联的NSViewControllerItem
  • 将其Nib Name属性更改为新笔尖的名称
  • 将您的代码保存在-awakeFromNib

答案 2 :(得分:-1)

对于从原型NSCollectionViewItem复制的视图,不会调用

-awakeFromNib。将您的绑定代码放在initWithCoder:中,您应该没问题。