我有一个正常工作的 NSCollectionView
,但有一个轻微但关键的异常。获取并突出显示集合中的所选项目。
在 Snow Leopard 之前,我已经完成了所有这些工作,但似乎有些东西发生了变化,我无法完全理解它,所以我将我的 NSCollectionView
恢复到基本状态测试并按照 Apple 的文档在此处创建 NSCollectionView:
按照快速入门指南, Collection View 工作正常。但是,本指南不讨论除之外的选择,“这些功能包括合并 ImageView 、将对象设置为可选或不可选以及在选中时更改颜色”
。
以此为例,我进入下一步,使用 Controller 键 selectionIndexes
将 Array Controller 绑定(bind)到 NSCollectionView
,我认为这会绑定(bind)任何选择在 NSCollectionView
和数组 Controller 之间创建一个 KVO 通知。我还将 NSCollectionView
设置为在 IB 中可选择。
NSCollectionView
似乎没有选择委托(delegate),并且与大多数 Cocoa UI View 不同,似乎没有默认选择的突出显示。
所以我的问题实际上归结为一个相关问题,但是两个截然不同的问题。
- 如何捕获项目的选择?
- 如何显示项目的亮点?
NSCollectionView
的编程指南似乎少之又少,通过 Google 进行的大多数搜索似乎都是为了提取 Snow Leopard 之前的实现,或者在单独的 XIB 文件中使用该 View 。
对于后者( View 的单独 XIB 文件),我不明白为什么这应该是先决条件,否则我会怀疑 Apple 不会将 View 包含在与 Collection View 项相同的包中.
我知道这将是一个“只见树木不见森林”的问题 - 所以我已经准备好迎接“哦!”时刻。
像往常一样,非常感谢您的帮助。
更新 1
好的,所以我想找到选定的项目,但还没有找到突出显示。对于有兴趣计算所选项目的人(假设您遵循 Apple 指南):
在 Controller 中(在我的测试用例中,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 的建议,但仍有问题。发布相关的类方法以查看我哪里出错了。
MyView.h
#import <Cocoa/Cocoa.h>
@interface MyView : NSView {
BOOL selected;
}
@property (readwrite) BOOL selected;
@end
MyView.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
MyCollectionViewItem.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
最佳答案
如果不同的背景颜色足以作为高亮显示,您可以简单地使用 NSBox 作为集合项 View 的根项。 用您选择的高亮颜色填充 NSBox。 将 NSBox 设置为自定义,这样填充就可以工作了。 将 NSBox 设置为透明。
将NSBox的透明度属性绑定(bind)到File Owner(Collection Item)的selected属性 将透明绑定(bind)的值转换器设置为 NSNegateBoolean。
我试图附上 Interface builder 截图,但我被拒绝了,因为我是新手 :-(
关于objective-c - NSCollectionView 中的选择突出显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2541572/