2015-02-11 13 views
6

In meiner Anwendung habe ich eine Sicht basiert NSTableView mit einer Spalte. Die Hervorhebungsfarbe der Zeilen ist auf regulär (blau) eingestellt. Ich muss diese Farbe in meine benutzerdefinierte Farbe ändern. Im Interface Builder habe ich versucht, es zu ändern, aber die einzigen Optionen sind "Keine, normale und Quellliste".Cocoa Osx NSTableview Zeilenfarbe ändern

Ich habe versucht, diesen Beitrag Lösung ohne Erfolg: https://stackoverflow.com/a/9594543/3065901

ich gelesen, dass ich dieses Delegatmethode verwenden, aber ich weiß nicht, wie diese zu verwenden.

Ich habe versucht, die Zeile in dieser Methode zu zeichnen, aber ich bekomme ungültige Kontext Warnungen und die Zeile immer noch mit der gleichen Higlight. Bitte geben Sie ein einfaches Beispiel für die Verwendung dieser Delegiertenmethode an:

Brauchen Sie Hilfe bitte. Danke im Voraus.

+0

Sind Sie Ansicht basierend Tableview oder Zelle basiert. – Srinidhi

+0

Ich benutze View Based – user3065901

Antwort

8

Von diesem link drawRow Probe außer Kraft setzen.

MyNSTableRowView.h

#import <Cocoa/Cocoa.h> 
@interface MyNSTableRowView : NSTableRowView 
@end 

MyNSTableRowView.m

#import "MyNSTableRowView.h" 

@implementation MyNSTableRowView 
- (id)init 
{ 
    if (!(self = [super init])) return nil; 
    return self; 
} 

- (void)drawSelectionInRect:(NSRect)dirtyRect { 
    if (self.selectionHighlightStyle != NSTableViewSelectionHighlightStyleNone) { 
    NSRect selectionRect = NSInsetRect(self.bounds, 2.5, 2.5); 
    [[NSColor colorWithCalibratedWhite:.65 alpha:1.0] setStroke]; 
    [[NSColor colorWithCalibratedWhite:.82 alpha:1.0] setFill]; 
    NSBezierPath *selectionPath = [NSBezierPath bezierPathWithRoundedRect:selectionRect 
                   xRadius:6 yRadius:6]; 
    [selectionPath fill]; 
    [selectionPath stroke]; 
    } 
} 
@end 

AppDelegate.m

- (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row 
{   
    MyNSTableRowView *rowView = [[MyNSTableRowView alloc]init]; 
    return rowView; 
} 
2

Wenn Sie Zelle basierend Tableview verwenden, setzen Sie die NSTableView selectionHighLightStyle auf None NSTableView und unter

- (void)drawRow:(NSInteger)row clipRect:(NSRect)clipRect { 
     NSColor* bgColor = Nil; 
    // Set the color only when its first responder and key window 
    if (self == [[self window] firstResponder] && [[self window] isMainWindow] && [[self window] isKeyWindow]) 
    { 
     bgColor = [NSColor brownColor]; 
    } 
    else 
    { 
     bgColor = [NSColor windowBackgroundColor];; 
    } 

    NSIndexSet* selectedRowIndexes = [self selectedRowIndexes]; 
    if ([selectedRowIndexes containsIndex:row]) 
    { 
     [bgColor setFill]; 
     NSRectFill([self rectOfRow:row]); 
    } 
    [super drawRow:row clipRect:clipRect]; 
} 
7

Hier ist die Antwort von user3065901 in Swift 3:

class MyNSTableRowView: NSTableRowView { 

    override func drawSelection(in dirtyRect: NSRect) { 
     if self.selectionHighlightStyle != .none { 
      let selectionRect = NSInsetRect(self.bounds, 2.5, 2.5) 
      NSColor(calibratedWhite: 0.65, alpha: 1).setStroke() 
      NSColor(calibratedWhite: 0.82, alpha: 1).setFill() 
      let selectionPath = NSBezierPath.init(roundedRect: selectionRect, xRadius: 6, yRadius: 6) 
      selectionPath.fill() 
      selectionPath.stroke() 
     } 
    } 
} 

NSTableViewDelegate:

func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? { 
    return MyNSTableRowView() 
} 
+0

Du bist großartig! Danke für diese Lösung. – ixany

+0

Das funktioniert ziemlich gut, aber das Problem, das ich habe, ist, dass das Zeilenhighlight diese Farbe behält, selbst wenn der Tisch in seinem "unscharfen" Zustand ist. Wenn Sie beispielsweise eine Zeile auswählen und dann auf ein 'NSTextField' klicken, wird die Tabellenzeile immer noch hervorgehoben, aber der Text wird wieder dunkel. Hier ist ein Beispielvideo: https://d.pr/v/0KmToP ... irgendeine Idee, wie man die Hintergrundfarbe dieses Zustandes ändert? –

0

unten Zeile in Tableview Methode hinzufügen

ObjectiveC

[yourtableview setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleNone]; 

Swift

yourtableview.selectionHighlightStyle = .none