虽然我没有在集合视图上实现任何示例,但根据您的查询,我仍然有一些想法。
我们可以创建集合视图项的自定义子类,并放置一个使用背景颜色显示选择的背景视图。
每当集合视图中的选择发生变化时,我们都可以使用委托方法获取委托调用,例如
- (void)collectionView:(NSCollectionView *)collectionView didSelectItemsAtIndexPaths:(NSSet *)indexPaths
在这个方法中,我们可以使用自定义集合项上的一些布尔属性来检查项目是否已经被选中。如果项目已经被选中,那么我们可以设置集合项目背景视图的清晰背景颜色,否则可以设置选择颜色。在内部,我们可以管理所选项目的索引数组。
希望能给你一些帮助。
我已经实现了一个示例,用于显示创建集合项的子类的多选。
在这个示例中,我创建了自定义集合视图项。有一个包含按钮和点击按钮的边框视图我正在更改边框视图颜色以显示为选中此项目。我们可以再创建一个项目属性,比如索引号。您可以在这个子类中创建协议并调用委托对象来存储所选项目的索引,以便进一步对其执行一些操作。
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