如何使我的NSCollectionView项目可选?

时间:2013-01-24 23:28:25

标签: cocoa binding

awakeFromNib我有:

[projectArrayController addObserver:self
                    forKeyPath:@"selectionIndexes"
                       options:NSKeyValueObservingOptionNew
                       context:nil];

我有:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
                        change:(NSDictionary *)change context:(void *)context {
    NSLog(@"%@ forObject: %@",keyPath, object);
    if([keyPath isEqualTo:@"selectionIndexes"]){
        NSUInteger numberOfSelected = [[projectArrayController selectedObjects] count];
        if(numberOfSelected >0){
            if (numberOfSelected == 1){
                ProjectModel *pm =  (ProjectModel *)[[projectArrayController selectedObjects] objectAtIndex:0];
                [pm setSelected:YES];
            }
        }
    }
}

记录日期:selectionIndexes forObject: <NSArrayController: 0x1001cb6e0>[object class: ProjectModel, number of selected objects: 1]

但是当我运行程序时,我实际上无法点击任何其他内容。为什么是这样? 我应该使用什么类型的代表?到目前为止,我尝试使用tableview委托和collectionview委托。

或者,我怎样才能让我的NSCollectionView成为第一个响应者?

1 个答案:

答案 0 :(得分:1)

我有这个工作,但这并不容易。您必须将集合视图的子视图子类化,该子视图是NSView的子类。这是我的子类看起来像......

@implementation GiggleCollectionSubView
@synthesize itIsSelected;

- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        itIsSelected = NO;
    }
    return self;
}

- (void)dealloc {
    [super dealloc];
}

- (void)awakeFromNib {

}

- (void)drawRect:(NSRect)rect {
    [[NSColor clearColor] set];
    if (self.itIsSelected) {
        [NSGraphicsContext saveGraphicsState];
        NSSetFocusRingStyle(NSFocusRingAbove);
        [[NSBezierPath bezierPathWithRect:NSInsetRect([self bounds], 2, 2)] fill];
        [NSGraphicsContext restoreGraphicsState];
    } else {
        [[NSBezierPath bezierPathWithRect:[self bounds]] fill];
    }
}

- (void)mouseDown:(NSEvent *)theEvent {
    if ([theEvent clickCount]==1) {
        if (![self itIsSelected]) {
            [[[NSApp delegate] giggleWindowController] clearCollectionView];
            [self setItIsSelected:YES];
            [self setNeedsDisplay:YES];
            [[[NSApp delegate] giggleWindowController] updateSelectionIndexes];
            [[[NSApp delegate] giggleWindowController] showSelectedImage];
        }
    }
}

@end

所以你可以看到我有一个名为itIsSelected的实例变量。这是关键。我手动管理那个使一切正常的变量。首先在drawRect方法中,它确定子视图是否具有绘制的聚焦环以指示选择了子视图。接下来在mouseDown:方法中,我检测用户单击子视图以选择它的位置。在那里,我手动管理数组控制器的selectionIndexes并手动管理所有子视图的itIsSelected实例变量。所以首先我为clearCollectionView方法中的所有子视图设置itIsSelected为NO。接下来,我为点击的子视图设置itIsSelected为YES。然后我更新数组控制器的selectionIndexes,然后根据selectedObject做一些事情(例如在showSelectedImage中)。这是两种方法。

-(void)clearCollectionView {
    NSArray* cvViews = [artistImagesCV subviews];
    for (GiggleCollectionSubView* aView in cvViews) {
        if ([aView itIsSelected]) {
            [aView setItIsSelected:NO];
            [aView setNeedsDisplay:YES];
        }
    }
}

-(void)updateSelectionIndexes {
    NSArray* cvViews = [artistImagesCV subviews];
    NSMutableIndexSet* indexes = [NSMutableIndexSet indexSet];

    NSUInteger counter = 0;
    for (GiggleCollectionSubView* aView in cvViews) {
        if ([aView itIsSelected]) [indexes addIndex:counter];
        counter++;
    }
    [googleImagesArrayController setSelectionIndexes:(NSIndexSet*)indexes];
}

注意:在我的子视图中,我还有一个图像视图。我必须将其子类化并在其mouseDown方法中执行类似操作。

无论如何,我希望这会有所帮助。我无法使用您尝试的方法使其正常工作,因此我按照说明手动完成。祝你好运。