У меня есть вид, основанный на NSOutlineView
, который отображает записи (исходный объект) из хранилища основных данных. Представление в виде схемы использует настраиваемый элемент управления, который реализуется как подкласс NSView
. Этот элемент управления отображает круглый цветной маркер на основе численного значения (0-7). Это значение сохраняется как атрибут объекта Source и предназначено как метод для реализации метода маркировки, подобный Finder.Обновление чертежа настраиваемого элемента управления NSView задерживается. Зачем?
Все это связано с привязками к IB.
Я прилагаю скриншот, который, мы надеемся, сделает мои намерения понятными.
Все работает хорошо, но для одной действительно раздражающей детали. Когда числовое значение изменяется (с правой стороны экрана), пользовательский элемент управления обновляется только при изменении выбора в виде схемы. Очевидно, было бы лучше, если бы это изменение отразилось сразу, но я до сих пор не справился. Я пробовал различные сценарии с setNeedsDisplay: YES
, которые были в основном проигнорированы.
Любые идеи?
Edit: я реализовал сеттер с таможенным контролем:
- (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];
}
}
Я ничего не вижу в правой части экрана? Покажите код, который вы используете, когда вы изменяете числовое значение. – rdelmar
Если вы создали пользовательский класс представления для отображения цветного маркера, и вы связали вещи с помощью привязок, вы внедрили пользовательскую привязку? Как? Вы следовали методу, описанному в разделе «Темы программирования привязки какао: как работают привязки?» (Https://developer.apple.com/library/mac/# documentation/Cocoa/Conceptual/CocoaBindings/Concepts/HowDoBindingsWork.html) –
@KenThomases: Я не реализовал пользовательские привязки. См. Мое редактирование для моего - очевидного - не работающего подхода. – Roger