微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

xcode – 如何从头开始以编程方式创建NSCollectionView?

NSCollectionView仍然是我见过的Cocoa API中最神秘的部分之一.文档很差,并且有许多移动部件,其中许多通常在Interface Builder中实现,使文档具有挑战性.

请提供示例代码以创建最简单的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 举报,一经查实,本站将立刻删除。

相关推荐