2017-01-18 4 views
0

私はNSCollectionViewと協力していて、複数の選択を追加したいと考えています。私はAllows Multiple Selectionをxibにチェックしましたが、Select + Dragアクションによる選択のみで動作します。私はすべてのコレクションビュー項目でシングルタップで選択を実装したい。私はそれをどのようにすることができますか?私は選択された状態をモデルに直接保存することを考えましたが、もっとエレガントなアプローチがあると思います。NSCollection複数の選択をiOSのように表示

編集:

を私は複数の選択が押されたShiftキーで動作することを発見しました。とにかく、ドラッグして選択肢を提示したい。

答えて

1

私はコレクションビューでサンプルを実装していませんでしたが、依然としてクエリごとに考えています。

コレクションビューアイテムのカスタムサブクラスを作成し、背景色を使用して選択を示す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 
+0

コレクションアイテムの再利用についてはどうですか?私の意見では、カスタムサブクラス化では、選択されたアイテムの配列を持つコレクションビューのプロパティを追加し、そのインデックスに基づいて選択状態を変更できます。しかし、私は 'NSCollectionView'のサブクラスが良い方法であるとは確信していません –

+0

より良い方法でこのクエリに答えるためのサンプルを1つ作成しました。私は前の答えを編集し、いくつかのコードを追加しました。 私はhttp://www.knowstack.com/nscollectionview-sample-code/を参照しました –

関連する問題