我不知道有一個在編程和不綁定創建集合視圖很大的啓示,但在這裏不言而喻。
介紹
基本上有使用集合視圖時四個部分組成:
- 查看:
NSView
一個子類,負責顯示信息;
- 集合視圖本身;
- 視圖控制器:的
NSCollectionViewItem
用作集合視圖項目的原型的子類;
- 型號:對象的數組。
通常一個視圖是在Interface Builder中設計的,而一個模型是由Cocoa綁定調解的。
否則它編程:
常量
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
視圖控制器(原型)
通常的視圖控制器加載從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];
集合視圖
到目前爲止,這是成立的唯一關係是使用的視圖(BVView
)由項目原型(BVPrototype
)。收集視圖必須通知它應該使用的原型以及從中獲取數據的模型。
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", @"Molly", @"Armitage",
@"Hideo", @"The Finn", @"Maelcum", @"Wintermute", @"Neuromancer", 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
有關NSCollectionView的文檔是驚人的差。瞭解這個神話般的野獸是如何工作,並且可以分享他們的知識的人,正在幫助各地的Objective-C開發人員。非常感謝。 – Tronathan 2012-02-07 00:14:31
Bavarious,我可以問你展示如何同步收藏視圖與可變數組項目? – brigadir 2012-05-25 09:10:36
@Bavarious - 感謝您的一個很好的答案。 – 2012-11-12 19:03:45