Cocoa 如何在NSOutlineView中展开/折叠组行后强制重画组行

Cocoa 如何在NSOutlineView中展开/折叠组行后强制重画组行,cocoa,nsoutlineview,Cocoa,Nsoutlineview,我尝试调用setNeedsDysplay:和setNeedsDisplayInRect:但traffackgroundinrect:和drawsepositionornrect:不是为组行调用的,而是为其他所有行调用的 这是我的一段代码: - (void)outlineView:(NSOutlineView *)outlineView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row { id prevItem =

我尝试调用setNeedsDysplay:和setNeedsDisplayInRect:但traffackgroundinrect:和drawsepositionornrect:不是为组行调用的,而是为其他所有行调用的

这是我的一段代码:

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

…但在某些情况下速度太慢了

好的,这就成功了:

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