Я не уверен, что есть много идей для создания представления коллекции программно и без привязок, но здесь все идет.
Введение
Существуют четыре компонента при использовании представления коллекции:
- Представление: подкласс
NSView
, отвечающий за отображение информации; - Само представление коллекции;
- Контроллер представления: подкласс
NSCollectionViewItem
, которыйслужит прототипом элемента представления коллекции; - Модель: массив объектов.
Обычно представление создается в Интерфейсном Разработчике, а модель опосредуется привязками Какао.
Выполнение этого программным способом:
Константы
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
View Controller (Prototype)
Обычно контроллер представления загружает свое представление из файла пера.В тех редких случаях, когда контроллер представления не получает свое представление из nib-файла, разработчик должен либо отправить его -setView:
до получения -view
контроллером представления, либо переопределить -loadView
.Следующий код выполняет последнее.
Контроллеры представления получают соответствующий объект модели через -setRepresentedObject:
.Я переопределил его, чтобы обновлять заголовок кнопки при каждом изменении объекта модели.Обратите внимание, что это может быть достигнуто путем использования привязок Какао без какого-либо кода вообще.
Обратите внимание, что ни один из этого кода не является специфическим для представлений коллекции - это общее поведение контроллера представления.
@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