在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成为第一个响应者?
答案 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方法中执行类似操作。
无论如何,我希望这会有所帮助。我无法使用您尝试的方法使其正常工作,因此我按照说明手动完成。祝你好运。