2017-01-18 3 views
0

NSCollectionView으로 작업 중이며 여러 항목을 추가하고 싶습니다. xib에서 Allows Multiple Selection을 확인했지만 Select + Drag 동작으로 선택 영역에서만 작동합니다. 모든 컬렉션보기 항목에서 한 번 탭하여 선택을 구현하고 싶습니다. 내가 어떻게 할 수 있니? 선택된 상태를 모델에 직접 저장하는 방법에 대해 생각했지만보다 세련된 접근법이 있다고 생각합니다.NSCollectionView iOS와 같은 다중 선택

편집 됨 :

은 그 다중 선택을 누르고 Shift 키와 함께 작동 발견했다. 어쨌든, 드래그하여 선택을 제시하고 싶습니다.

답변

1

컬렉션보기에는 샘플을 구현하지 않았지만 쿼리에 따라 생각할 수있는 아이디어가 있습니다.

컬렉션보기 항목의 사용자 지정 하위 클래스를 만들고 배경색을 사용하여 선택을 보여주는 하나의 배경보기를 배치 할 수 있습니다.

모음보기에서 선택의 변화는 우리는 대리인이 방법을 사용하여 대리자 호출을 얻을 수 있습니다 때마다 같은

  • (무효) collectionView로 (NSCollectionView *) collectionView의 didSelectItemsAtIndexPaths : (NSSet *) indexPaths

이 메서드에서는 사용자 지정 컬렉션 항목의 일부 bool 속성을 사용하여 항목이 이미 선택되어 있는지 여부를 확인할 수 있습니다. 항목이 이미 선택된 경우 컬렉션 항목 배경보기의 배경색을 깨끗하게 설정할 수 있습니다. 그렇지 않으면 선택 색상을 설정할 수 있습니다. 또한 내부적으로 선택된 항목의 인덱스 배열을 관리 할 수 ​​있습니다.

도움이되기를 바랍니다.

필자는 Collection Item의 하위 클래스를 만드는 다중 선택을 보여주기 위해 하나의 샘플을 구현했습니다.

이 샘플에서는 사용자 지정 컬렉션보기 항목을 만들었습니다. 단추가있는 테두리보기가 있고 단추를 눌렀을 때이 항목이 선택된 것처럼 테두리보기 색이 변경됩니다. 인덱스 번호와 같은 항목 속성을 하나 더 만들 수 있습니다. 그리고 당신은이 서브 클래스 내에서 프로토콜을 생성하고 델리게이트 객체를 호출하여 선택한 항목 인덱스를 저장하여 그 위에 몇 가지 연산을 수행 할 수 있습니다.

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

방금 ​​더 나은 방법으로이 쿼리에 대답하기 위해 하나의 샘플을 만들었습니다. 이전 답변을 편집하고 일부 코드를 추가했습니다. 나는 http://www.knowstack.com/nscollectionview-sample-code/를 참고했다. –