我有一个基于视图NSOutlineView
,它显示来自核心数据存储的条目(源实体)。大纲视图中的视图使用自定义控件,该控件被实现为NSView
. 此控件根据数值 (0-7) 显示圆形彩色标记。此值存储为 Source 实体的属性,旨在作为一种实现类似 Finder 的标记方法的方法。
整个事情都是使用与 IB 的绑定来连接的。
我附上了一张截图,希望能让我的意图清楚。
这一切都很好,但对于一个非常烦人的细节。当数值改变时(从屏幕右侧),自定义控件仅在大纲视图中的选择改变时更新。显然,立即反映这种变化会更好,但到目前为止我失败了。我尝试了各种场景,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];
}
}