私はコレクションビューでサンプルを実装していませんでしたが、依然としてクエリごとに考えています。
コレクションビューアイテムのカスタムサブクラスを作成し、背景色を使用して選択を示す1つの背景ビューを配置できます。
コレクションビューでの選択変更は、我々は、デリゲートメソッドを使用して、デリゲートの呼び出しを得ることができるときはいつでも、このような
- (無効)collectionViewとして:(NSCollectionView *)collectionViewのdidSelectItemsAtIndexPaths:(NSSet *)indexPaths
このメソッドでは、カスタムコレクション項目のboolプロパティを使用して、アイテムがすでに選択されているかどうかを確認できます。アイテムがすでに選択されている場合、コレクションアイテムの背景色の透明な背景色を設定できます。そうでない場合、選択色を設定できます。また、内部的には、選択したアイテムのインデックスの配列を管理できます。
私はあなたにいくつかの助けを願っています。
私はCollection Itemのサブクラスを作成する複数選択を示すために1つのサンプルを実装しました。
このサンプルでは、カスタムコレクションビューアイテムを作成しました。ボタンとヒットを含む1つのボーダービューがあり、このアイテムが選択されたように表示されるようにボーダービューの色を変更しています。インデックス番号のようなアイテムプロパティをもう1つ作成できます。また、このサブクラス内でプロトコルを作成し、その上で何らかの操作を実行するために、選択されたアイテムインデックスを格納するデリゲートオブジェクトを呼び出すことができます。
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'のサブクラスが良い方法であるとは確信していません –
より良い方法でこのクエリに答えるためのサンプルを1つ作成しました。私は前の答えを編集し、いくつかのコードを追加しました。 私はhttp://www.knowstack.com/nscollectionview-sample-code/を参照しました –