【问题标题】:NSCollectionView multiple selection like in iOSNSCollectionView 多选,就像在 iOS 中一样
【发布时间】:2017-01-18 16:40:34
【问题描述】:

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

已编辑:

我发现多重选择适用于按下 Shift 键。无论如何,我想通过拖动来呈现选择。

【问题讨论】:

    标签: macos selection nscollectionview


    【解决方案1】:

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

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

    每当集合视图中的选择发生变化时,我们都可以使用委托方法获取委托调用,例如

    • (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
    

    【讨论】:

    • 收藏品的再利用怎么样?在我看来,通过自定义子类化,我可以添加带有所选项目数组的集合视图的属性,并根据其索引更改选择状态。但我不确定NSCollectionView 的子类是好方法
    • 我刚刚创建了一个示例来更好地回答这个问题。我编辑了上一个答案并添加了一些代码。我推荐了knowstack.com/nscollectionview-sample-code
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多