- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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/
我正在为 macOS 实现一个应用程序,我在其中使用 NSCollectionView 作为一种时间轴。为此,我使用了 NSCollectionViewFlowLayout 的自定义子类,原因如下:
我有一个带有 3 个 NSTableViews 和 1 个 NSCollectionView 的窗口。集合 View 显示图像。我希望能够选择其中一个图像并使用键盘删除键将其删除,但我无法让 coll
我正在开发在 NSCollectionView 中显示 svg 图标的应用程序。我想实现拖放功能,以允许用户将 svg 拖到 Finder 或其他应用程序。我有两个问题: 1.) 为了实现对另一个应用
我在网上寻找了这个,但我找不到任何关于如何成功实现 NSCollectionView 的明确教程。我应该如何进行? 在Interface Builder中,我可以将一个NSCollectionView
我有一个NSCollectionView其中 subview 之一是 NSImageView 。实际图像需要在执行 API 调用后从网络服务器加载(因此实际上是两个网络请求)。显然我需要异步加载图像。
我有一系列项目,我在 NSCollectionView 中显示它们。选择和多重选择均已启用。 用户可以通过拖动来选择项目(即通过拖动来标记项目)。但是,当用户开始从 Collection View 背
我最近让我的 NSCollectionView 正常工作,它以正确的方式处理部分。我通过添加“选定”模型 key 路径的绑定(bind)来实现此目的。此操作隐藏蓝色 View ,向用户显示选择。问题是
在我的 Collection View 中,我需要为每个项目生成一个索引。当项目重新排序时,我需要此索引更新其新位置。 数据是托管 NSArrayController 中的核心数据实体。我最接近的可能
我试图通过实现 -(void)magnifyWithEvent:(NSEvent *)event 在 NSCollectionView 中进行捏缩放,但我不确定在这个方法中要做什么。我通过 [even
我尝试遵循本指南: Quick Start for Collection Views 在 Collection View 项中使用 NSImageView。 什么也没有显示,无论我用图像设置图像还是通
当我制作 NSCollectionView UI 时... 第一次,我使用 注册了我的 Collection View 项目类 self.cv.register(NSNib.init(nibNamed
假设我在 Collection View 中有一个项目,该项目将在 Collection View 的第一行居中。 对于多个项目,所有这些项目都将在 Collection View 中水平分布,并在它
我有一个 NSCollectionView 绑定(bind)到一个 NSArrayController,其中包含 NSMutableArray 作为内容。 NSMutableArray 中的项目按其应
我有一个 NSCollectionView,它由消息应用程序中的数十行单列项目(聊天消息)组成。 每个项目都包含一个高度不同的文本区域。因此,在创建 View 时 View 应默认位于底部,并在收到新
我需要在 NSCollectionView 中进行拖放。 所以我查看了苹果的代码示例: https://developer.apple.com/library/mac/#samplecode/Icon
我正在尝试从 NSCollectionView 中获得类似延迟加载的行为。 (老实说,我以为它有它,就像 UITableView - 似乎是一个明显的遗漏?) 无论如何,我正在单元格中显示图像,并且希
我试图让我的程序识别 NSCollectionView 的双击。我尝试遵循本指南:http://www.springenwerk.com/2009/12/double-click-and-nscoll
我正在尝试在 NSCollectionView 中实现拖放,这将允许重新排列 View 中的单元格。我已经设置了委托(delegate)并实现了以下方法: -(BOOL)collectionView:
NSCollectionView 仍然是我所见过的 Cocoa API 中最神秘的部分之一。文档很差,并且有许多移动部件,其中许多通常在 Interface Builder 中实现,这使得文档变得具有
我正在创建一个没有 xib/storyboard 的 NSCollectionview,当触摸项目时,collectionView:didSelectItemsAt: 方法从未调用过。在 viewdi
我是一名优秀的程序员,十分优秀!