代码之家  ›  专栏  ›  技术社区  ›  Austin

如何在nsCollectionView的View子类中进行编程绑定?

  •  4
  • Austin  · 技术社区  · 17 年前

    我已经成功地创建了一个nsCollectionView,并在ib中向视图原型添加了一个标签,绑定到我所表示对象的一个属性。现在,我想通过编程创建一个nsbutton和nstextfield,其中nstextfield绑定到我所表示对象的一个属性。单击按钮时,我希望显示和隐藏nstextfield。

    我遇到的问题是,如果我将控件的初始化代码放在视图的initwowcoder方法中,而将绑定放在视图的awakefromnib中,绑定就不会挂起。如果我将控件的初始化放在awakefromnib中,当单击按钮时,我无法访问视图中的控件(使用nslog打印时,这些控件为空)。

    据我所知,问题可能在于nsCollectionView的工作方式是,它创建视图的实例,然后复制集合视图中每个对象的数量。如何让按钮初始化和绑定与原型副本一起工作?

    下面是我的初始化代码和我在awakefromnib中针对我的子类视图的绑定:

    子视图

    @interface SubView : NSView {
        NSButton *button;
        NSTextField *textField;
        IBOutlet NSCollectionViewItem *item; // Connected in IB to my NSCollectionViewItem
    }
    
    - (IBAction)buttonClicked:(id)sender;
    
    @end
    

    子视图

    @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 回复  |  直到 12 年前
        1
  •  12
  •   j0k gauthamp    13 年前

    这听起来像我刚做的事情,所以也许这是你需要的。

    子类 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
    

    希望这里离你需要去的地方很近…

        2
  •  1
  •   Iris Artin    12 年前

    -awakeFromNib 如果nsCollectionViewItem与nsCollectionView位于同一个笔尖中,则不会对该视图调用,但如果将该视图放在单独的笔尖中,则会调用该视图。

    • 创建空的NIB文件(blahblahcollectionViewItem.nib)。
    • 从你的笔尖上剪下收藏项目视图
    • 粘贴到新的NIB文件中
    • 将其所有者的类更改为nsCollectionViewItem。
    • 将所有者上的视图插座连接到新粘贴的视图
    • 打开包含nsviewcontroller的NIB文件
    • 选择关联的nsviewControllerItem
    • 将其nib name属性更改为新nib的名称
    • 将代码保留在 苏醒
        3
  •  -1
  •   kperryua    17 年前

    -awakeFromNib 对于从原型nsCollectionViewItem复制的视图,不调用。输入绑定代码 initWithCoder: 你应该没事的。