2016-05-02 7 views
0

Ich habe eine Ansicht-basierte NSTableView mit meiner benutzerdefinierten Ansicht und die normale NSTextField drin. Die Hintergrundfarbe der benutzerdefinierten Ansicht sollte sich ändern, wenn ein Benutzer klickt und es nicht funktioniert, da drawRect nicht aufgerufen wird. Ich verstehe nicht wirklich warum. Hier sehen Sie die Delegate-Methode und den Code für die benutzerdefinierte Ansicht.DrawRect wird nicht für NSTableView Zellenansicht aufgerufen

MyController

- (void)didAddLabel:(id)sender { 
    CustomLabel *label = (CustomLabel *)sender; 

    NSTableRowView *aaa = [_tableView rowViewAtRow:_tableView.selectedRow makeIfNecessary:NO]; 
    MyCustomView *hello = [((NSTableCellView*)[aaa viewAtColumn:0]).subviews objectAtIndex:0]; 

    [hello setBackgroundColor:[label nscolor]]; 
    NSLog(@"Background colour is %@", [hello backgroundColor]); 
    [hello setNeedsDisplay:YES]; 
} 

Meine Ansicht

class MyCustomView: NSView { 

    var backgroundColor :NSColor = NSColor.purpleColor() 

    override func drawRect(dirtyRect: NSRect) { 
     NSLog("In here") 
     backgroundColor.setFill() 
     NSRectFill(dirtyRect) 
    } 
} 

Beobachtungen: 1) die drawRect nur auf init der App aufgerufen wird. 2) Die Zeile NSLog enthält die neue/ausgewählte Farbe, der Hintergrund ändert sich jedoch nicht von violett.

Frage: Warum wird drawRect: nicht nach setNeedsDisplay: aufgerufen?

+1

.und Sie geben Ihre benutzerdefinierte 'NSTableCellView'-Unterklasse auf jeden Fall an die entsprechende Stelle in der Tabelle zurück, d. H., Sie haben sichergestellt, dass das, was Sie in Ihr 'MyCustomView' * umwandeln, tatsächlich diese Klasse ist? – Jay

+0

Danke für diesen Einblick. Die Ansicht hatte tatsächlich den Index 1 statt 0. Sie können Ihre Antwort posten. – Rabiees

Antwort

0

drawRect: wird nur aufgerufen, wenn die Layer-Unterstützung nicht aktiviert ist. Sind eine der übergeordneten Ansichten/diese Ansicht wantsLayer = YES oder ist ihr ein CALayer zugewiesen? In diesem Fall müssen Sie updateLayer: verwenden, da alle untergeordneten Elemente einer Schicht-unterstützten Ansicht automatisch mit Ebenen gesichert werden.

+0

Bitte beachten Sie meinen Kommentar oben. – Rabiees

Verwandte Themen