objective-c - NSCollectionView 中的选择突出显示

标签 objective-c cocoa nsview nscollectionview nscollectionviewitem

我有一个正常工作的 NSCollectionView,但有一个轻微但关键的异常。获取并突出显示集合中的所选项目。

在 Snow Leopard 之前,我已经完成了所有这些工作,但似乎有些东西发生了变化,我无法完全理解它,所以我将我的 NSCollectionView 恢复到基本状态测试并按照 Apple 的文档在此处创建 NSCollectionView:

http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/CollectionViews/Introduction/Introduction.html

按照快速入门指南, Collection View 工作正常。但是,本指南不讨论除之外的选择,“这些功能包括合并 ImageView 、将对象设置为可选或不可选以及在选中时更改颜色”

以此为例,我进入下一步,使用 Controller 键 selectionIndexes 将 Array Controller 绑定(bind)到 NSCollectionView,我认为这会绑定(bind)任何选择在 NSCollectionView 和数组 Controller 之间创建一个 KVO 通知。我还将 NSCollectionView 设置为在 IB 中可选择。

NSCollectionView 似乎没有选择委托(delegate),并且与大多数 Cocoa UI View 不同,似乎没有默认选择的突出显示。

所以我的问题实际上归结为一个相关问题,但是两个截然不同的问题。

  1. 如何捕获项目的选择?
  2. 如何显示项目的亮点?

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/

相关文章:

iphone - 有没有办法以编程方式在 iPhone 上给定的点触发触摸事件?

cocoa - DBL_MAX & double 型的最大值

cocoa - 动画 NSStatusItem

ios - 更新 UISnapBehavior 点

objective-c - EXC_BAD_ACCESS 中的code=1 和code=2 有什么区别?

objective-c - 如何在 iOS 8 上显示没有按钮的 UIAlertView?

objective-c - 将 NSWindow 显示为 NSStatusItem 的下拉列表?

cocoa : Refresh NSObjectController after unarchiving Data from disk

cocoa - 如何显示从单独的 NIB 文件加载的 subview

cocoa - NSMenuItem 的 NSView 子类