私は、NSCollectionView
マイナーではあるが重大な例外を 1 つ扱っています。コレクション内の選択された項目を取得して強調表示します。
私は Snow Leopard の前にこのすべての作業を行っていましたが、何かが変わったようで、指を置くことができないのでNSCollectionView
、基本的なテストに戻って、NSCollectionView を作成するための Apple のドキュメントに従いました。
コレクション ビューは、クイック スタート ガイドに従って正常に動作します。ただし、このガイドでは、 以外の選択については説明しません"There are such features as incorporating image views, setting objects as selectable or not selectable and changing colors if they are selected"
。
NSCollectionView
これを例として使用して、コントローラー キーを使用しselectionIndexes
てArray Controller を にバインドする次のステップに進みましたNSCollectionView
。NSCollectionView
また、IBで選択できるように設定しました。
NSCollectionView
ほとんどの Cocoa UI ビューとは異なり、デフォルトで選択されたハイライトがないように見えます。
したがって、私の問題は実際には関連する問題に帰着しますが、2 つの異なる質問があります。
- アイテムの選択をキャプチャするにはどうすればよいですか?
- アイテムのハイライトを表示するにはどうすればよいですか?
NSCollectionView
のプログラミング ガイドはほとんどなく、Google を介したほとんどの検索では、Snow Leopard より前の実装が表示されるか、別の XIB ファイルのビューが使用されているようです。
後者 (ビュー用の別の XIB ファイル) の場合、これが前提条件である理由がわかりません。そうしないと、Apple がコレクション ビュー アイテムと同じバンドルにビューを含めなかったのではないかと疑っていたでしょう。
これが「木を見て木が見えない」問題になることはわかっています。一瞬。
いつものように、ありとあらゆる助けが大歓迎です。
更新 1
わかりましたので、選択したアイテムを見つけることを考えましたが、まだハイライトを理解していません。選択した項目を理解することに興味がある場合 (Apple ガイドに従っていると仮定します):
コントローラー (私のテストケースでは App Delegate) に以下を追加しました:
In 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