NSCollectionView在iOS中有多种选择

时间:2017-01-18 06:36:51

标签: macos selection nscollectionview

我正在使用NSCollectionView并希望添加多个选择。我在xib中检查了Allows Multiple Selection,但仅适用于选择+拖动操作。我想通过单击每个集合视图项来实现选择。我怎么能这样做?我想过将所选状态直接保存到模型中,但我想有更优雅的方法。

编辑:

我发现按下Shift可以进行多项选择。无论如何,我想通过拖动来呈现选择。

1 个答案:

答案 0 :(得分:1)

虽然我没有在集合视图上实现任何示例,但仍然根据您的查询在我的脑海中有一些想法。

我们可以创建集合视图项的自定义子类,并放置一个背景视图,使用背景颜色显示选择。

只要在集合视图中选择更改,我们就可以使用委托方法(例如

)来获取委托调用
  • (void)collectionView:(NSCollectionView *)collectionView didSelectItemsAtIndexPaths:(NSSet *)indexPaths

在此方法中,我们可以使用自定义集合项上的某些bool属性检查项是否已被选中。如果项目已经选中,那么我们可以设置收集项目背景视图的清晰背景颜色,否则可以设置选择颜色。在内部,我们可以管理所选项目的索引数组。

我希望它会给你一些帮助。

我已经实现了一个示例,用于显示创建集合项的子类的多个选择。

在此示例中,我创建了自定义集合视图项。有一个包含按钮和按钮的边框视图我正在更改边框视图颜色以显示此项目被选中。我们可以再创建一个项目属性,如索引号。您可以在此子类中创建协议,并调用委托对象来存储所选的项索引,以进一步对其执行某些操作。

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