2014-10-27 17 views
5

Ich versuche, benutzerdefinierte Zeilenfarbe zu implementieren, wenn die Tabellenzeile ausgewählt ist.NSTableRowView/NSTableCellZum Anzeigen der benutzerdefinierten Farbe für die ausgewählte Zeile?

-(void)tableViewSelectionDidChange:(NSNotification *)notification{ 


    NSInteger selectedRow = [_mainTable selectedRow]; 

    NSTableCellView *cell = [_mainTable rowViewAtRow:selectedRow makeIfNecessary:NO]; 

    cell.layer.backgroundColor = [NSColor redColor].CGColor; 

    NSLog(@"selected"); 
} 

Aber das funktioniert nicht. Ich finde die Apple-Dokumentation sehr unübersichtlich (vielleicht irre ich mich). Ich habe keine Erfahrung mit Mac-Programmierung.

Kann jemand eine Lösung vorschlagen? Grundsätzlich brauche ich diese Auswahl, um transparent zu sein.

+0

@meda Haben Sie eine Idee? – Johnny

+0

Ihre Frage wurde bereits beantwortet .. gehen Sie hier http://stackoverflow.com/questions/11920156/custom-uitableviewcell-selection-style –

+1

@Rana Talllal dies ist von Ios. – Johnny

Antwort

8

ersten Satz Tableview Auswahl Highlight Stil

NSTableViewSelectionHighlightStyleNone 

dann in Ihrem tablView Delegat

tableView:shouldSelectRow: 

implementieren und diesen Code in ihm schreiben:

UITableViewRow *row= [_mainTable rowViewAtRow:selectedRow makeIfNecessary:NO]; 
row.backgroundColor = [your color]; 
return YES; 

lesen Sie diese auch https://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSTableViewDelegate_Protocol/index.html#//apple_ref/occ/intfm/NSTableViewDelegate/tableView:rowViewForRow :

für die Auswahl Stil https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTableView_Class/index.html#//apple_ref/occ/instp/NSTableView/selectionHighlightStyle

+1

für NSTableRowView Ich musste tableRowView.needsDisplay = YES setzen, um sicherzustellen, dass die Ansicht nach dem Ändern der Farbe neu gezeichnet wird. – sust86

+3

Wie erfolgt die Abwahl? – bithavoc

+2

Warum geben Sie ein iOS-Beispiel (UITableViewRow ... UI * ist nur iOS), wenn Sie nach einem NSTableView gefragt werden? – Mecki

7

Lösung

Dies sollte durch Subklassen NSTableRowView und dann Rückkehr der Unterklasse in der NSTableView Delegatmethode
-(NSTableRowView*)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row

Subclassing NSTableRowView bietet viel mehr Flexibilität getan werden wenn Sie Ihre Zeilenansicht ändern. Die Rückgabe Ihrer Unterklasse in der NSTableView Delegiertenmethode über entfernt automatisch auch die Hintergrundauswahlfarbe, wenn Sie von einer Zeile zur nächsten klicken (was ein offenes Problem in der anderen Antwort ist).


Schritte

Zuerst Unterklasse NSTableRowView und außer Kraft setzen drawSelectionInRect seine Hintergrundfarbe zu ändern, wenn sie ausgewählt:

@implementation MyTableRowView 

- (void)drawSelectionInRect:(NSRect)dirtyRect 
{ 
    [super drawSelectionInRect:dirtyRect]; 
    [[NSColor yellowColor] setFill]; 
    NSRectFill(dirtyRect); 
} 

Als nächstes zurückkehren Ihre subclassed Reihe Ansicht, die die rowViewForRowNSTableView Delegatmethode mit:

- (NSTableRowView*)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row 
{ 
    static NSString* const kRowIdentifier = @"MyTableRow"; 
    MyTableRowView* myRowView = [tableView makeViewWithIdentifier:kRowIdentifier owner:self]; 
    if (!myRowView) { 
     myRowView = [[MyTableRowView alloc] initWithFrame:NSZeroRect]; 
     myRowView.identifier = kRowIdentifier; 
    } 
    return rowView; 
} 

Mit diesem Ansatz können Sie auch andere Elemente wie die Trennfarbe leicht überschreiben.Um dies zu tun, überschreiben die drawSeparatorInRect Methode in Ihrer NSTableRowView Unterklasse wie folgt:

- (void)drawSeparatorInRect:(NSRect)dirtyRect 
{ 
    // Change the separator color if the row is selected 
    if (self.isSelected) [[NSColor orangeColor] setFill]; 
    else [[NSColor grayColor] setFill]; 
    // Fill the seperator 
    dirtyRect.origin.y = dirtyRect.size.height - 1.0; 
    dirtyRect.size.height = 1.0; 
    NSRectFill(dirtyRect); 
} 

Ressourcen

Zwingende NSTableRowView Anzeigeeinstellungen https://developer.apple.com/reference/appkit/nstablerowview

NSTableView rowViewForRow Delegatmethode https://developer.apple.com/reference/appkit/nstableviewdelegate/1532417-tableview

+1

Dies sollte die Antwort sein. – keyOfVv

Verwandte Themen