NSCollectionView — это класс, позволяющий показывать на экране коллекцию айтемов. Структура коллекции — абсолютно произвольная, но обычно NSCollectionView используется для всяких сетко-подобных контролов с ячейками, хедерами и футерами. Понимая, насколько абстрактен данный класс, разработчики Apple создали мощный механизм для создания любых лейаутов. По большому счету, даже NSTableView это конкретная реализация NSCollectionView Возможности данного класса, в каком-то смысле, фантастические.
На просторах сети очень много примеров по созданию NSCollectionView с байндингами (NSCollectionView with bindings). Как бы все хорошо, все работает, но вопрос в том как оно работает?
В NSCollectionView также как и в NSTableView есть парочка важных методов, без которых ничего работать не будет, т.е. будет, но ничего не выдаст.
Метод -setPrototype - в него нужно передать экземпляр сабкласса NSCollectionViewItem.
@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
Метод -setContent - в него нужно передать массив модели.
@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
Метод -setRepresentedObject - (указан в коде выше) в него передаем нашу модель.
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
Документация по NSCollectionView сама по себе немного скудновата, но если хорошо пошерстить вэб-сеть, то можно что-то и нарыть.
В следующих статьях под тегом "Мой проект", я опишу как можно создать NSCollectionView на основе NSView. В принципе там не так уж и сложно, почти как с таблицами в предыдущих постах.
0 коментарі:
Отправить комментарий