4

我已经成功地创建了一个 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
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 的视图与 NSCollectionView 位于同一 nib 中,则不会在该视图上调用该视图,但如果您将视图放在单独的 nib 中,则会调用该视图。

  • 创建一个空的 nib 文件 (BlahBlahCollectionViewItem.nib)。
  • 将集合项目视图从您拥有的任何笔尖中剪切出来
  • 将其粘贴到新的 nib 文件中
  • 将其所有者的类更改为 NSCollectionViewItem。
  • 将所有者上的视图出口连接到新粘贴的视图
  • 打开包含 NSViewController 的 nib 文件
  • 选择关联的 NSViewControllerItem
  • 将其 Nib Name 属性更改为新 nib 的名称
  • 保留您的代码-awakeFromNib
于 2013-12-08T01:13:46.747 回答
-1

-awakeFromNib不为从原型 NSCollectionViewItem 复制的视图调用。把你的绑定代码放进去initWithCoder:,你应该没问题。

于 2009-07-31T03:25:44.137 回答