0

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 成为第一响应者?

4

1 回答 1

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: 方法中的 Next 是我检测用户何时单击子视图以选择它的位置。在那里我手动管理数组控制器的 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 方法中执行类似操作。

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

于 2013-01-25T04:01:38.933 回答