我有NSCollectionView一个次要但关键的例外情况。获取并突出显示集合中的选定项目。
在 Snow Leopard 之前,我已经完成了所有这些工作,但似乎发生了一些变化,我无法完全确定它,所以我NSCollectionView回到了基本测试,并按照 Apple 的文档在此处创建 NSCollectionView:
按照快速入门指南,集合视图可以正常工作。但是,本指南不讨论除"There are such features as incorporating image views, setting objects as selectable or not selectable and changing colors if they are selected".
以此为例,我进入下一步,NSCollectionView使用控制器键将 Array Controller 绑定到selectionIndexes,认为这将绑定我在NSCollectionView和 数组控制器之间所做的任何选择,从而触发 KVO 通知。我还将NSCollectionViewIB 设置为可选。
似乎没有选择委托,NSCollectionView并且与大多数 Cocoa UI 视图不同,似乎没有默认选择的突出显示。
所以我的问题真的归结为一个相关的问题,但是两个不同的问题。
- 如何捕获对项目的选择?
- 如何显示项目的亮点?
NSCollectionView的编程指南似乎少之又少,大多数通过 Google 进行的搜索似乎都提取了 Snow Leopard 之前的实现,或者在单独的 XIB 文件中使用视图。
对于后者(视图的单独 XIB 文件),我不明白为什么这应该是先决条件,否则我会怀疑 Apple 不会将视图包含在与集合视图项相同的包中。
我知道这将是一个“只见树木不见森林”的问题——所以我已经准备好迎接“doh!”。片刻。
像往常一样,非常感谢任何和所有帮助。
更新 1
好的,所以我想找到选定的项目,但还没有想出突出显示。对于对确定所选项目感兴趣的人(假设您遵循 Apple 指南):
在控制器(在我的测试用例 App Delegate 中)中,我添加了以下内容:
在 awakeFromNib
[personArrayController addObserver:self
forKeyPath:@"selectionIndexes"
options:NSKeyValueObservingOptionNew
context:nil];
新方法
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if([keyPath isEqualTo:@"selectionIndexes"])
{
if([[personArrayController selectedObjects] count] > 0)
{
if ([[personArrayController selectedObjects] count] == 1)
{
personModel * pm = (PersonModel *)
[[personArrayController selectedObjects] objectAtIndex:0];
NSLog(@"Only 1 selected: %@", [pm name]);
}
else
{
// More than one selected - iterate if need be
}
}
}
不要忘记为非 GC 解除分配
-(void)dealloc
{
[personArrayController removeObserver:self
forKeyPath:@"selectionIndexes"];
[super dealloc];
}
仍在寻找高光分辨率...
更新 2
接受了 Macatomy 的建议,但仍有问题。发布相关的类方法,看看我哪里出错了。
我的视图.h
#import <Cocoa/Cocoa.h>
@interface MyView : NSView {
BOOL selected;
}
@property (readwrite) BOOL selected;
@end
我的视图.m
#import "MyView.h"
@implementation MyView
@synthesize selected;
-(id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self) {
// Initialization code here.
}
return self;
}
-(void)drawRect:(NSRect)dirtyRect
{
NSRect outerFrame = NSMakeRect(0, 0, 143, 104);
NSRect selectedFrame = NSInsetRect(outerFrame, 2, 2);
if (selected)
[[NSColor yellowColor] set];
else
[[NSColor redColor] set];
[NSBezierPath strokeRect:selectedFrame];
}
@end
我的CollectionViewItem.h
#import <Cocoa/Cocoa.h>
@class MyView;
@interface MyCollectionViewItem : NSCollectionViewItem {
}
@end
"MyCollectionViewItem.m*
#import "MyCollectionViewItem.h"
#import "MyView.h"
@implementation MyCollectionViewItem
-(void)setSelected:(BOOL)flag
{
[(MyView *)[self view] setSelected:flag];
[(MyView *)[self view] setNeedsDisplay:YES];
}
@end



