gpt4 book ai didi

cocoa - 如何使我的 NSCollectionView 项目可供选择?

转载 作者:行者123 更新时间:2023-12-03 17:55:21 25 4
gpt4 key购买 nike

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]

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

或者,如何使我的 NSCollectionView 成为第一响应者?

最佳答案

我成功了,但这并不容易。您必须对 Collection View 的 subview 进行子类化,该 subview 是 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方法中,它确定 subview 是否绘制了焦点环以指示 subview 被选择。 mouseDown: 方法中的下一步是我检测用户何时单击 subview 来选择它。在那里,我手动管理数组 Controller 的 SelectionIndexes 并手动管理所有 subview 的 itIsSelected 实例变量。因此,首先我将 ClearCollectionView 方法中的所有 subview 的 itIsSelected 设置为 NO。接下来,我将单击的 subview 的 itIsSelected 设置为 YES。然后我更新数组 Controller 的选择索引,然后根据 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];
}

注意:在我的 subview 中,我还有一个 ImageView 。我必须对其进行子类化,并在其 mouseDown 方法中执行类似的操作。

无论如何,我希望这会有所帮助。我无法使用您尝试的方法让它工作,所以我按照解释手动完成了它。祝你好运。

关于cocoa - 如何使我的 NSCollectionView 项目可供选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14512751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com