我剛剛發現(在側邊欄中)這個問題,建議子類NSTableRowView
。我之前已經做到了,但沒有奏效。我已經試了一次,相當令人驚訝現在的工作......
Handling custom selection style in view based NSTableView
然而,這個答案不是非常豐富,所以我會盡量覆蓋什麼,我爲了讓已經做了這項工作。
首先,我實現了下面的NSTableView委託方法並返回nil!:
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{
return nil;
}
爲了使用基於視圖(我猜NSTableViewRow被認爲是一個視圖基於表,以及...),你必須實現此方法表。我不太確定我可能做錯了什麼,但是如果沒有這種方法,我的細胞就不會顯示!
確保不讓NSTableView的處理任何選擇通過設置該屬性:
yourNSTableView.selectionHighlightStyle = NSTableViewSelectionHighlightStyleNone;
好了,現在我們要建立我們的細胞具有以下的委託方法:
-(NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row{
static NSString *cellID = @"cell_identifier";
//use this if you want to reuse the cells
CustomTableRowView *result = [tableView makeViewWithIdentifier:cellID owner:self];
if (result == nil) {
result = [[CustomTableRowView alloc] initWithFrame:NSMakeRect(0, 0, self.frame.size.width, 80)];
result.identifier = cellID;
}
result.data = [tableData objectAtIndex:row];
// Return the result
return result;
}
好了,所以現在繼承NSTableRowView
和實現/重寫以下兩種方法:
首先,我們必須覆蓋setSelected:
我n爲了使單元格在選中時重繪其背景。所以在這裏,它是:
-(void)setSelected:(BOOL)selected{
[super setSelected:selected];
[self setNeedsDisplay:YES];
}
正如前面提到的,我們稱之爲setNeedsDisplay:
爲了使細胞重繪其背景。
最後,繪製代碼。覆蓋的方法drawBackgroundInRect:
這樣的:
-(void)drawBackgroundInRect:(NSRect)dirtyRect{
if (!self.selected) {
[[NSColor clearColor] set];
} else {
[someColor set];
}
NSRectFill(dirtyRect);
}
我發現我並不需要第一位,但其他人幫助+1。謝謝。 – lateAtNight
@lateAtNight很高興幫助:) –
萬一它可以幫助其他人,我試圖在10.9上使用Swift來做到這一點,並獲得CGContextRef有點不同。看到這個答案尋求幫助:http://stackoverflow.com/a/24056236/2708274 – Matt