Как принудительно перерисовать строку группы в 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];
}