gpt4 book ai didi

cocoa - 基于 NSView 的自定义控件绘图更新被延迟。为什么?

转载 作者:行者123 更新时间:2023-12-03 17:24:37 25 4
gpt4 key购买 nike

我有一个基于 View 的NSOutlineView,它显示来自核心数据存储的条目(源实体)。大纲 View 中的 View 使用自定义控件,该控件作为 NSView 的子类实现。该控件显示基于数值 (0-7) 的圆形彩色标记。该值存储为 Source 实体的属性,旨在作为实现类似 Finder 的标记方法的方法。

整个事情都是使用 IB 绑定(bind)来连接的。

我附上了一张屏幕截图,希望能清楚地表明我的意图。

一切都很好,但有一个非常烦人的细节。当数值更改(从屏幕右侧)时,仅当大纲 View 中的选择更改时,自定义控件才会更新。显然,立即反射(reflect)此更改会更好,但到目前为止我失败了。我已经尝试了 setNeedsDisplay: YES 的各种场景,但基本上都被忽略了。

有什么想法吗?

enter image description here

编辑:我使用自定义控件实现了一个 setter :

- (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];
}
}

最佳答案

我使用通知重新实现了整个事情。我无法使用绑定(bind)让它工作。这是我所做的:

NSOutlineView 的 Controller (屏幕的左侧部分)使用以下方法为其元素分配 View :

- (NSView *) outlineView: (NSOutlineView *) outlineView viewForTableColumn: (NSTableColumn *) tableColumn item: (id) anItem

当与文件(图像、PDF 等)关联的实体添加到大纲 View 时,该特定项目的项目 View (NSTableCellView 的自定义子类)会注册对更改的兴趣实体的 labelValue 属性:

[[NSNotificationCenter defaultCenter] addObserver: aView selector: @selector(labelValueChanged:) name: @"LabelValueChanged" object: nil];

当 labelValue 属性发生更改时(通过单击屏幕右侧的按钮之一),该 Controller 会触发通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"LabelValueChanged" object:[self selectedSource]];

通过通知系统,项目 View (在 NSOutlineView 中)调用方法 labelValueChanged:,这会使实际绘制项目的自定义 View 组件的显示无效。标签:

- (void) labelValueChanged: (NSNotification*) aNotification {
// A notification was received that the label was changed. Mark the label object of the receiver
// if the object in the notification (anObject) matches the object of the receiver (objectValue).
id anObject = [aNotification object];
if (anObject == [self objectValue]) {
[[self label] setNeedsDisplay:YES];
}
}

感谢@KenThomases 的建议。

关于cocoa - 基于 NSView 的自定义控件绘图更新被延迟。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10666439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com