2012-05-19 2 views
1

У меня есть вид, основанный на NSOutlineView, который отображает записи (исходный объект) из хранилища основных данных. Представление в виде схемы использует настраиваемый элемент управления, который реализуется как подкласс NSView. Этот элемент управления отображает круглый цветной маркер на основе численного значения (0-7). Это значение сохраняется как атрибут объекта Source и предназначено как метод для реализации метода маркировки, подобный Finder.Обновление чертежа настраиваемого элемента управления NSView задерживается. Зачем?

Все это связано с привязками к IB.

Я прилагаю скриншот, который, мы надеемся, сделает мои намерения понятными.

Все работает хорошо, но для одной действительно раздражающей детали. Когда числовое значение изменяется (с правой стороны экрана), пользовательский элемент управления обновляется только при изменении выбора в виде схемы. Очевидно, было бы лучше, если бы это изменение отразилось сразу, но я до сих пор не справился. Я пробовал различные сценарии с setNeedsDisplay: YES, которые были в основном проигнорированы.

Любые идеи?

enter image description here

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]; 
    } 
} 
+0

Я ничего не вижу в правой части экрана? Покажите код, который вы используете, когда вы изменяете числовое значение. – rdelmar

+0

Если вы создали пользовательский класс представления для отображения цветного маркера, и вы связали вещи с помощью привязок, вы внедрили пользовательскую привязку? Как? Вы следовали методу, описанному в разделе «Темы программирования привязки какао: как работают привязки?» (Https://developer.apple.com/library/mac/# documentation/Cocoa/Conceptual/CocoaBindings/Concepts/HowDoBindingsWork.html) –

+0

@KenThomases: Я не реализовал пользовательские привязки. См. Мое редактирование для моего - очевидного - не работающего подхода. – Roger

ответ

0

Я повторно выполнил все, используя уведомления. Я не мог заставить его работать, используя привязки. Вот что я сделал:

Контроллер NSOutlineView (левой части экрана) распределяет представления для ее элементов с использованием метода:

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

Когда объект, связанный с файлом (изображения, PDF и т.д.) добавляются в режим структуры, представление элементов (пользовательский подкласс NSTableCellView) для этого конкретного элемента регистрирует интерес к изменениям в labelValue собственности лица:

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

при изменении в labelValue Prope RTY происходит (через клик по одной из кнопок в правой части экрана), что контроллер запускает уведомление:

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

Повсеместно системы уведомлений, метод labelValueChanged: вызывается, по мнению пункта (в NSOutlineView), который аннулирует отображение пользовательских компонентов просмотреть, что на самом деле черпает ярлык:

- (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 за его предложения.