gpt4 book ai didi

objective-c - 如何以编程方式绑定(bind) NSCollectionView 的 View 子类?

转载 作者:太空狗 更新时间:2023-10-30 03:58:07 24 4
gpt4 key购买 nike

我已经成功地创建了一个 NSCollectionView 并在 IB 中为 View 原型(prototype)添加了一个标签,绑定(bind)到我所表示的对象的一个​​属性。我现在想以编程方式创建一个 NSButton 和 NSTextField,并将 NSTextField 绑定(bind)到我表示的对象的属性。单击按钮时,我想显示和隐藏 NSTextField。

我遇到的问题是,如果我将控件的初始化代码放在 View 的 initWithCoder 方法中,并将绑定(bind)放在 View 的 awakeFromNib 中,则绑定(bind)不会连接起来。如果我将控件的初始化放在 awakeFromNib 中,单击按钮时,我无权访问 View 中的控件(使用 NSLog 打印时它们为空)。

据我所知,问题可能出在 NSCollectionView 的工作方式上,它创建 View 的一个实例,然后根据 Collection View 中的对象数量复制它。如何让按钮初始化并绑定(bind)到原型(prototype)副本?

下面是我的初始化代码和我在 awakeFromNib 中为我的子类 View 绑定(bind)​​:

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

最佳答案

这听起来和我刚刚做的很相似,所以也许这就是您所需要的。

子类 NSCollectionView并覆盖:

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object

newItemForRepresentedObject: 中,检索 View 项,然后添加您的控件和任何编程绑定(bind):

@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

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

关于objective-c - 如何以编程方式绑定(bind) NSCollectionView 的 View 子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1210352/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com