我已经在雪豹之前的所有这些工作,但一些似乎已经改变,我不能把我的手指,所以我把我的NSCollectionVIEw回到一个基本的测试,并按照苹果的文档创建一个NSCollectionVIEw在这里:
http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/CollectionViews/Introduction/Introduction.html
快速入门指南后,集合视图工作正常。然而,本指南不讨论除“具有合并图像视图,将对象设置为可选择或不可选择和如果选择了改变颜色”等特征。
使用这个例子,我进入下一步使用控制器键selectionIndexes将数组控制器绑定到NSCollectionVIEw,认为这将绑定在NSCollectionVIEw和数组控制器之间的任何选择,从而触发KVO通知。我也设置NSCollectionVIEw在IB可选择。
似乎没有选择委托NSCollectionVIEw和大多数Cocoa UI视图不同,似乎没有默认选择高亮。
所以我的问题真的归结为一个相关的问题,但两个不同的问题。
>如何捕获项目的选择?
>如何显示项目的突出显示?
NSCollectionVIEw的编程指南似乎是很少和远在之间,通过谷歌的大多数搜索似乎拉起前的雪豹实现,或使用视图在一个单独的XIB文件。
对于后者(用于视图的单独的XIB文件),我不明白为什么这应该是一个先决条件,否则我怀疑苹果不会将视图包含在集合视图项目的同一个包中。
我知道这将是一个“看不见树木的树”的问题 – 所以我准备了“doh!时刻。
像往常一样,任何和所有的帮助非常赞赏。
更新1
OK,所以我想找到所选项目,但尚未计算突出显示。对于感兴趣的选择项目(假设你遵循苹果指南):
在控制器(在我的测试用例中的应用程序代理)我添加了以下:
在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 } } }
不要忘记dealloc为非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,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解决方法 它不太难做。确保在Interface Builder中为NSCollectionVIEw启用了“选择”。然后在您用于原型视图的NSVIEw子类中,声明一个名为“selected”的属性:
@property (reaDWrite) BOol selected;
更新代码这里:(添加超级电话)
子类NSCollectionVIEwItem和overrIDe -setSelected:
- (voID)setSelected:(BOol)flag{ [super setSelected:flag]; [(PrototypeVIEw*)[self vIEw] setSelected:flag]; [(PrototypeVIEw*)[self vIEw] setNeedsdisplay:YES];}
然后你需要在你的原型视图的drawRect:方法中添加代码来绘制突出显示:
- (voID)drawRect:(NSRect)dirtyRect { if (selected) { [[NScolor bluecolor] set]; NSRectFill([self bounds]); }}
这只是简单地填充蓝色的视图,当它的选择,但可以自定义绘制高亮任何你想要的方式。我已经在我自己的应用程序中使用它,它的工作伟大。
总结以上是内存溢出为你收集整理的objective-c – 选择突出显示在NSCollectionView中全部内容,希望文章能够帮你解决objective-c – 选择突出显示在NSCollectionView中所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)