Ich denke, Sie müssen die Unterklasse NSTableView
und außer Kraft setzen drawRow:clipRect:
. Eine andere Möglichkeit wäre das Überschreiben drawGridInClipRect:
aber das ist etwas umständlicher, weil Sie die Zeilen manuell heraussuchen müssen.
Das sollte Sie auf den richtigen Weg bringen:
- (void)drawRow:(NSInteger)rowIndex clipRect:(NSRect)clipRect {
// First do the default drawing
[super drawRow:rowIndex clipRect:clipRect];
// Check if there's content in any of the cells in this row
BOOL doesHaveContent = NO;
int numCols = [self numberOfColumns];
int colIndex;
for( colIndex = 0; colIndex < numCols; colIndex++ ){
NSCell * cell = [self preparedCellAtColumn:colIndex
row:rowIndex];
if( [cell objectValue] != nil ){
doesHaveContent = YES;
break;
}
}
if( doesHaveContent ){
NSRect rowRect = [self rectOfRow:rowIndex];
NSBezierPath * gridPath = [NSBezierPath bezierPath];
// Ignoring clipRect because this isn't a lot of drawing
[gridPath moveToPoint:rowRect.origin];
[gridPath lineToPoint:NSMakePoint(rowRect.origin.x + rowRect.size.width,
rowRect.origin.y)];
[gridPath moveToPoint:NSMakePoint(rowRect.origin.x,
rowRect.origin.y + rowRect.size.height)];
[gridPath lineToPoint:NSMakePoint(rowRect.origin.x + rowRect.size.width,
rowRect.origin.y + rowRect.size.height)];
[myGridColor set];
[gridPath stroke];
// You could also just do:
// [myGridColor set];
// [[NSBezierPath bezierPathWithRect:rowRect] stroke];
}
}
Eine weitere Möglichkeit wäre, eine benutzerdefinierte NSCell
Jede Zelle kann einen speziellen Rahmen um sich selbst ziehen, wenn sie einen Inhalt hat. Dies würde jedoch nicht eine Linie über die gesamte Zeile zeichnen, wenn es einige Zellen in der Zeile, die leer waren.