프로그래밍 방식으로 그리고 바인딩없이 컬렉션 뷰를 만드는 데 많은 통찰력이 있는지는 모르겠습니다 만 여기서는 간략히 설명합니다.
- 보기 : 네 가지 구성 요소 콜렉션 뷰 사용하여 기본적으로 있습니다 소개
정보를 표시 할 책임이 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 파일에서 해당보기를 가져 오지 않는 드문 경우에 개발자는 -setView:
을 보내고 -view
을보기 컨트롤러가 수신하거나 -loadView
을 무시해야합니다. 다음 코드는 후자를 수행합니다.
View 컨트롤러는 -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
Bavarious, 변경할 수있는 배열로 컬렉션보기를 동기화하는 방법을 보여줄 수 있습니까? – brigadir
@Bavarious - 좋은 답변에 감사드립니다. –