NSOutlineView
コア データ ストアからのエントリ (ソース エンティティ) を表示するビュー ベースがあります。アウトライン ビューのビューは、 のサブクラスとして実装されるカスタム コントロールを使用しますNSView
。このコントロールは、数値 (0 ~ 7) に基づいて色付きの丸いマーカーを表示します。この値は、Source エンティティの属性として格納され、Finder に似たラベル付け方法を実装する方法として意図されています。
全体が IB のバインディングを使用して配線されています。
私の意図が明確になることを願って、スクリーンショットを添付しました。
それはすべてうまく機能しますが、本当に厄介な詳細が1つあります. 数値が (画面の右側から) 変更された場合、カスタム コントロールは、アウトライン ビューでの選択が変更された場合にのみ更新されます。明らかに、この変更がすぐに反映される方が良いでしょうが、これまでのところ失敗しています。setNeedsDisplay: YES
基本的にすべて無視されたさまざまなシナリオを試しました。
何か案は?
編集:カスタムコントロールでセッターを実装しました:
- (void) setLabelValue: (NSNumber*) aValue {
labelValue = aValue;
[self setNeedsDisplay: YES];
}
setNeedsDisplay:
が再描画をトリガーするという理由で、メソッドdrawRect:
で値を照会して適切な色を確立します。
- (void)drawRect: (NSRect) dirtyRect {
// Label value between '1' and '7' indicate that a label was assigned. Determine label color and border color.
if ([[self labelValue] intValue] > 0) {
NSColor *aBackgroundColor = [NSColor clearColor];
switch ([[self labelValue] intValue]) {
case 1:
aBackgroundColor = [NSColor colorWithCalibratedRed:...];
break;
case 2:
aBackgroundColor = [NSColor colorWithCalibratedRed:...];
break;
case 3:
aBackgroundColor = [NSColor colorWithCalibratedRed:...];
break;
case 4:
aBackgroundColor = [NSColor colorWithCalibratedRed:...];
break;
case 5:
aBackgroundColor = [NSColor colorWithCalibratedRed:...];
break;
case 6:
aBackgroundColor = [NSColor colorWithCalibratedRed:...];
break;
case 7:
aBackgroundColor = [NSColor colorWithCalibratedRed:...];
break;
}
// Draw border first.
...
// Draw label color.
...
}
// Label value of '0' indicates that no label was assigned.
if ([[self labelValue] intValue] == 0) {
NSBezierPath *aPath = [NSBezierPath bezierPathWithRoundedRect: ...];
[[NSColor clearColor] set];
[aPath fill];
}
}