Как принудительно перерисовать строку группы в NSOutlineView после того, как она была развернута / свернута

Я пробовал звонить setNeedsDysplay: а также setNeedsDisplayInRect: но drawBackgroundInRect: а также drawSeparatorInRect: не для группового ряда, а для всего остального

Это кусок кода у меня есть:

- (void)outlineView:(NSOutlineView *)outlineView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row {
    id prevItem = [outlineView itemAtRow:row - 1];
    if ([self outlineView:outlineView isGroupItem:prevItem]) {
        id view = [self outlineView:outlineView rowViewForItem:prevItem];
        if (view) {
            [view setNeedsDisplay:YES];
        }
    }
}

редактировать

Вот что я придумал:

- (void)outlineView:(NSOutlineView *)outlineView didRemoveRowView:(NSTableRowView *)rowView forRow:(NSInteger)row {
    // TODO: find a be a better way to repaint a node after it's been collapsed
    for (NSView *view in outlineView.subviews) {
        NSInteger testRow = [outlineView rowForView:view];
        if (testRow == row - 1) {
            id item = [outlineView itemAtRow:testRow];
            if ([(id)outlineView outlineView:outlineView isGroupItem:item]) {
                [view setNeedsDisplay:YES];
            }
        }
    }
}

- (void)outlineView:(NSOutlineView *)outlineView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row {
    // TODO: find a be a better way to repaint a node after it's been expanded
    for (NSView *view in outlineView.subviews) {
        NSInteger testRow = [outlineView rowForView:view];
        if (testRow == row - 1) {
            id item = [outlineView itemAtRow:testRow];
            if ([(id)outlineView outlineView:outlineView isGroupItem:item]) {
                [view setNeedsDisplay:YES];
            }
        }
    }
}

... но в некоторых случаях это слишком медленно

1 ответ

Хорошо, это сделало трюк:

- (void)outlineViewItemDidCollapse:(NSNotification *)notification {
    NSInteger row = [_outlineView rowForItem:notification.userInfo[@"NSObject"]];
    NSView *rowView = [_outlineView rowViewAtRow:row makeIfNecessary:NO];
    [rowView setNeedsDisplay:YES];
}

- (void)outlineViewItemDidExpand:(NSNotification *)notification {
    NSInteger row = [_outlineView rowForItem:notification.userInfo[@"NSObject"]];
    NSView *rowView = [_outlineView rowViewAtRow:row makeIfNecessary:NO];
    [rowView setNeedsDisplay:YES];
}
Другие вопросы по тегам