2012-07-22 6 views
9

Używam widoku widoku opartego na widoku i nie chcę, aby rysował pola NSTextField z białym kolorem tekstu, gdy jest zaznaczony. Nie mogłem znaleźć działającego rozwiązania. Tak więc każda pomoc jest bardzo doceniana.Jak wyłączyć biały kolor tekstu w zaznaczeniu w NSTableView opartym na widoku?

Oto mój problem:

enter image description here

chcę "Wybór jest białe" text być również sporządzone w kolorze domyślnym tekstowym.

Dotychczas Pomyślałem, że

  • Ustawianie atrybutów w tableView:viewForTableColumn:item: naprawdę nie pomaga
  • Ustawianie NSTextField kolor do koloru niestandardowego, która jest czymś innym niż domyślny kolor sterowania zapobiegnie od wciągnięcia biały, ale nadal traci styl czcionki (pogrubiony, kursywa, itp.).
  • Ustawienie atrybutu NSTableView na selectionHighlightStyle na NSTableViewSelectionHighlightStyleNone rozwiązuje problem, ale nie zostanie odświeżone: NSTableRowView. Również wybrany styl nie jest tym, czego chcę. Chcę, aby pierwsze kliknięcie wybrało wiersz, a drugie kliknięcie pozwoli edytować pole tekstowe. Podczas korzystania z NSTableViewSelectionHighlightStyleNone pierwsze kliknięcie rozpoczyna edycję pola tekstowego.
  • Kolor tekstu nie zmienia się, jeśli granice NSTextext są ograniczone. Ale nie chcę pól z polami obramowanymi (jak pokazano na zrzucie ekranu) Pola tekstowe można edytować)

Nie mogłem określić "jak" pole tekstowe ma biały kolor. Przesunąłem setTextColor: i zdałem sobie sprawę, że nigdy nie jest wywoływane po zmianie selekcji. Myślę więc, że NSAttributedString jest zbudowany gdzieś wewnątrz procedury rysowania/wyboru NSTableView.

Każda pomoc jest bardzo doceniana.

Odpowiedz

12

Znalazłem odpowiedź. Musiałem podklasę NSTableCellView i zastąpić setBackgroundStyle:. To wszystko!

- (void)setBackgroundStyle:(NSBackgroundStyle)backgroundStyle { 
    [super setBackgroundStyle: NSBackgroundStyleLight]; 
} 
+0

Oh. Dziękuję Ci. Po prostu "niepełnosprawny" seter. Dla swift jest to: 'override var backgroundStyle: NSBackgroundStyle {get {return .Dark} set {}}' – surfrider

-1

Ustawiam kolor komórki w widoku mojej tabeli -tableView: willDisplayCell: forTableColumn: row: method.

-(void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell 
    forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 
{ 
    if(tableView==<table view id of interest>) 
     { 
     ... 
     [cell setTextColor:<colour appropriate for this cell>]; 
     ... 
     } 
    ... 
} 

Nie ma to wpływu na rozmiar lub stylizację czcionki.

+3

zobacz tabele oparte pracują inaczej. – cocoafan

+0

W jaki sposób działają one inaczej? Jeśli używasz 'NSTableView' lub podklasy, to jeśli twój obiekt kontrolera przyjmuje protokół' NSTableViewDelegate', pobiera powyższy selektor wiadomości. Używam dokładnie tej techniki do selektywnego wyszarzania wpisów w tabeli, gdy nie mają one zastosowania w danym kontekście. Po prostu nazywam '[tableViewId setDelegate: self]' w metodzie 'awakeFromNib:' mojego kontrolera i bingo. –

+1

Tabele oparte na komórkach i tabele oparte na widoku działają inaczej. Używasz tabeli opartej na komórce '-tableView: willDisplayCell: forTableColumn: row:' nigdy nie zostanie wywołane, jeśli używasz tabel opartych na widoku. Hej, dziękuję ci za pomoc. – cocoafan

0

Zamiast nadrzędnym NSTableCellView „s backgroundStyle, znalazłem to bardziej wygodne, aby zastąpić w NSTableRowViewviewWillDraw() zamiast. Jest to metoda, która domyślnie zmienia styl tła widoku komórki podczas zaznaczania.

by wyłączyć to zachowanie:

class TableViewDelegate: NSObject, NSTableViewDelegate { 
    func tableView(tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? { 
     return TableRowView(frame: NSRect.zero) 
    } 
} 

class TableRowView : NSTableRowView { 
    private override func viewWillDraw() { 
     // By do nothing we prevent the super method to be called. It would otherwise change the selected cell view's backgroundStyle property. 
    } 
} 
Powiązane problemy