请提供示例代码以创建最简单的NSCollectionView案例,该案例显示文本字段或按钮而不使用Xcode,其中每个文本字段或按钮具有不同的标题.使用默认窗口IBOutlet假设一个新的Xcode项目.
对于此示例,在数据源更改时不需要绑定来更新NSCollectionView.只需显示原型对象网格,并将每个对象的标题设置为某个值.
如果我们能够为很多人提供一个很好的例子,我认为这将有助于所有使用NSCollectionViews并且和我一样困惑的人.
请求摘要
>提供示例代码以在新的Xcode项目中呈现NSCollectionView
>不要使用Interface Builder,请使用提供的IBOutlet默认窗口
> NSCollectionView应包含文本字段或按钮,您的选择
>视图中的每个项目都应具有不同的标题
>不需要绑定
解决方法
介绍
使用集合视图时,基本上有四个组件:
> View:NSView的子类,负责显示信息;
>集合视图本身;
> View controller:NSCollectionViewItem的子类,用作集合视图项原型;
> Model:一个对象数组.
通常,视图是在Interface Builder中设计的,模型是由Cocoa绑定调解的.
以编程方式执行:
常量
static const NSSize buttonSize = {80,20}; static const NSSize itemSize = {100,40}; static const NSPoint buttonorigin = {10,10};
视图
这是一个包含按钮的标准视图(Interface Builder中的自定义视图).请注意,视图具有固定大小.
@interface BVView : NSView @property (weak) NSButton *button; @end @implementation BVView @synthesize button; - (id)initWithFrame:(NSRect)frameRect { self = [super initWithFrame:(NSRect){frameRect.origin,itemSize}]; if (self) { NSButton *newButton = [[NSButton alloc] initWithFrame:(NSRect){buttonorigin,buttonSize}]; [self addSubview:newButton]; self.button = newButton; } return self; } @end
查看控制器(原型)
通常,视图控制器从nib文件加载其视图.在极少数情况下,视图控制器无法从nib文件获取其视图,开发人员必须在视图控制器收到-view之前发送-setView:或者覆盖-loadView.以下代码执行后者.
视图控制器通过-setRepresentedobject:接收相应的模型对象.我已经覆盖了它,以便在模型对象发生变化时更新按钮标题.请注意,这可以通过使用Cocoa绑定来完成,而不需要任何代码.
请注意,此代码都不是特定于集合视图的 – 它是一般视图控制器行为.
@interface BVPrototype : NSCollectionViewItem @end @implementation BVPrototype - (void)loadView { [self setView:[[BVView alloc] initWithFrame:NSZeroRect]]; } - (void)setRepresentedobject:(id)representedobject { [super setRepresentedobject:representedobject]; [[(BVView *)[self view] button] setTitle:representedobject]; } @end
模型
表示按钮标题的简单字符串数组:
@property (strong) NSArray *titles; self.titles = [NSArray arrayWithObjects:@"Case",@"Molly",@"Armitage",@"Hideo",@"The Finn",@"Maelcum",@"Wintermute",@"Neuromancer",nil];
集合视图
到目前为止,唯一建立的关系是项目原型(BVPrototype)使用的视图(BVView).必须告知集合视图应该使用的原型以及从中获取数据的模型.
NSCollectionView *cv = [[NSCollectionView alloc] initWithFrame:[[[self window] contentView] frame]]; [cv setItemPrototype:[BVPrototype new]]; [cv setContent:[self titles]];
应用程序代表的完整源代码
#import "BVAppDelegate.h" static const NSSize buttonSize = { 80,20 }; static const NSSize itemSize = { 100,40 }; static const NSPoint buttonorigin = { 10,10 }; @interface BVView : NSView @property (weak) NSButton *button; @end @implementation BVView @synthesize button; - (id)initWithFrame:(NSRect)frameRect { self = [super initWithFrame:(NSRect){frameRect.origin,itemSize}]; if (self) { NSButton *newButton = [[NSButton alloc] initWithFrame:(NSRect){buttonorigin,buttonSize}]; [self addSubview:newButton]; self.button = newButton; } return self; } @end @interface BVPrototype : NSCollectionViewItem @end @implementation BVPrototype - (void)loadView { [self setView:[[BVView alloc] initWithFrame:NSZeroRect]]; } - (void)setRepresentedobject:(id)representedobject { [super setRepresentedobject:representedobject]; [[(BVView *)[self view] button] setTitle:representedobject]; } @end @interface BVAppDelegate () @property (strong) NSArray *titles; @end @implementation BVAppDelegate @synthesize window = _window; @synthesize titles; - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { self.titles = [NSArray arrayWithObjects:@"Case",nil]; NSCollectionView *cv = [[NSCollectionView alloc] initWithFrame:[[[self window] contentView] frame]]; [cv setItemPrototype:[BVPrototype new]]; [cv setContent:[self titles]]; [cv setAutoresizingMask:(NSViewMinXMargin | NSViewWidthSizable | NSViewMaxXMargin | NSViewMinYMargin | NSViewHeightSizable | NSViewMaxYMargin)]; [[[self window] contentView] addSubview:cv]; } @end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。