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
Другие вопросы по тегам