NSCollectionView множественный выбор как в iOS
Я работаю с NSCollectionView
и хочу добавить множественный выбор. Я проверил Allows Multiple Selection
в XIB, но работает только с выделением с помощью действия Select+Drag. Я хочу осуществить выбор одним нажатием на каждый элемент представления коллекции. Как я могу это сделать? Я думал о сохранении выбранного состояния в модель напрямую, но, думаю, есть более элегантный подход.
Отредактировано:
Я обнаружил, что множественный выбор работает с нажатой клавишей Shift. Во всяком случае, я хочу представить выбор путем перетаскивания.
1 ответ
Хотя я не реализовал ни одного примера в представлении коллекции, но все же у меня есть некоторые идеи в соответствии с вашим запросом.
Мы можем создать собственный подкласс элемента представления коллекции и разместить один фоновый вид, который показывает выбор, используя цвет фона.
Всякий раз, когда выбор изменяется в представлении коллекции, мы можем получить вызов делегата, используя метод делегата, такой как
- (void)collectionView:(NSCollectionView *)collectionView didSelectItemsAtIndexPaths:(NSSet *)indexPaths
В этом методе мы можем проверить, выбран ли элемент или нет, используя какое-либо свойство bool для пользовательского элемента коллекции. Если элемент уже выбран, мы можем установить чистый цвет фона для фона элемента коллекции, в противном случае можно установить цвет выделения. А внутри мы можем управлять массивом индексов выбранных элементов.
Я надеюсь, что это поможет вам.
Я реализовал один пример для демонстрации множественного выбора, создав подкласс элемента Collection.
В этом примере я создал пользовательский элемент представления коллекции. Существует один вид границы, который содержит кнопку и нажатие кнопки. Я изменяю цвет вида границы, чтобы он выглядел так, как будто выбран этот элемент. Мы можем создать еще одно свойство элемента, например, индексный номер. И вы можете создать протокол внутри этого подкласса и вызвать объект делегата, чтобы сохранить выбранный индекс элемента, чтобы выполнить некоторую операцию над ним далее.
AppDelegate.h
#import <Cocoa/Cocoa.h>
@class CustomCollectionItem;
@interface AppDelegate : NSObject <NSApplicationDelegate>
@property (strong) CustomCollectionItem *collectionViewItem;
@property (strong) NSArray *contents;
@property (nonatomic, weak) IBOutlet NSCollectionView *collectionView;
@end
AppDelegate.m
#import "AppDelegate.h"
#import "CustomCollectionItem.h"
@interface AppDelegate ()
@property (weak) IBOutlet NSWindow *window;
@end
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
[self populateCollectionView];
}
- (void)populateCollectionView
{
self.collectionViewItem = [[CustomCollectionItem alloc] init];
self.contents = @[
@{@"itemTitle":@"Item 1",
@"isSelected":@NO,
},
@{@"itemTitle":@"Item 2",
@"isSelected":@NO,
},
@{@"itemTitle":@"Item 3",
@"isSelected":@NO,
},
@{@"itemTitle":@"Item 4",
@"isSelected":@NO,
},
@{@"itemTitle":@"Item 5",
@"isSelected":@NO,
},
@{@"itemTitle":@"Item 6",
@"isSelected":@NO,
},
@{@"itemTitle":@"Item 7",
@"isSelected":@NO,
},
];
[self.collectionView setItemPrototype:self.collectionViewItem];
[self.collectionView setContent:self.contents];
}
@end
CustomCollectionItem.h
#import <Cocoa/Cocoa.h>
@interface CustomCollectionItem : NSCollectionViewItem
@property (nonatomic, weak) IBOutlet NSButton *button;
@property (nonatomic, weak) IBOutlet NSView *borderView;
@property (nonatomic, assign) BOOL showSelection;
- (IBAction)selectItemAction:(id)sender;
@end
CustomCollectionItem.m
#import "CustomCollectionItem.h"
@implementation CustomCollectionItem
- (void)setRepresentedObject:(id)representedObject
{
[super setRepresentedObject:representedObject];
if (representedObject !=nil)
{
[self.button setTitle:[representedObject valueForKey:@"itemTitle"]];
self.showSelection = [[representedObject valueForKey:@"isSelected"] boolValue];
}
else
{
[self.button setTitle:@"No Value"];
[self setShowSelection:NO];
}
}
#pragma mark - Button Action
- (IBAction)selectItemAction:(id)sender
{
self.showSelection = !self.showSelection;
if (self.showSelection)
{
[self.borderView.layer setBackgroundColor:[NSColor grayColor].CGColor];
}
else
{
[self.borderView.layer setBackgroundColor:[NSColor clearColor].CGColor];
}
}
@end