2015-04-24 22 views
5

Mam NSTableView, w którym zmieniam kolor tekstu w danej kolumnie, ale po wybraniu wiersza tekst nie zmienia się na bardziej odpowiedni kolor, więc że jest czytelny.Jak odwrócić kolor tekstu wybranego wiersza NSTableView

Data modyfikacji Zmodyfikowane, rozmiar i rodzaj kolumn mają szary tekst, a po wybraniu wiersza pliku/folderu szary tekst zmienia kolor na biały (aby był czytelny w niebieskim kolorze).

Nie mogę znaleźć magicznego pola wyboru na XCode, aby włączyć to zachowanie domyślnie, więc czy ktoś wie, w jaki sposób mogę osiągnąć ten sam efekt?

Używam Swift w XCode 6.3.

Dzięki.

Odpowiedz

14

Nie mówisz, jakiego widoku lub hierarchii widoków używasz dla swoich komórek. Nie mówisz też, w jaki sposób lub gdzie ustawiasz kolor pól tekstowych lub jaki jest ich kolor.

Po wybraniu wiersza automatycznie obliczana jest jego interiorBackgroundStyle. Ustawia także backgroundStyle widoku komórki, jeśli odpowiada na -setBackgroundStyle: lub jest NSControl z komórką, która na to odpowiada.

Jeśli widok z komórki jest instancją NSTableCellView, to przekazuje styl tła do wszystkich jego subskrybentów, które spełniają te same kryteria. Jeśli używasz innego widoku kontenera jako widoku komórki i chcesz, aby styl tła był przesyłany dalej w ten sposób, musisz to zaimplementować samodzielnie w klasie widoku.

Komórka (NSTextFieldCell) odpowiada na -setBackgroundStyle:, a więc jej styl tła jest automatycznie ustawiany przez powyższe mechanizmy. Komórka pola tekstowego automatycznie zmieni kolor tekstu na biały, jeśli jego textColor jest jednym ze standardowych kolorów kontrolnych (np. NSColor.controlTextColor()), ale nie zrobi tego, jeśli przypiszesz niestandardowy kolor. Tak więc, jeśli ustawiasz określony kolor tekstu, jesteś odpowiedzialny za jego zmianę, gdy zmienia się styl tła.

Można użyć podklasy NSTableCellView i dodać obiekt obserwujący właściwości (didSet) dla właściwości backgroundStyle. To może zmienić pole tekstowe na textColor w zależności od ustawionego stylu. Na przykład możesz użyć własnego koloru, jeśli styl tła nie jest .Dark lub użyj zwykłego koloru pola tekstowego NSColor.controlTextColor(), jeśli jest to .Dark (tak, że pole tekstowe faktycznie wyświetli je jako białe).

Możesz również użyć podklasy NSTextFieldCell dla swojego pola tekstowego i zrobić to samo. Możesz też zastąpić drawInteriorWithFrame(_:inView:), aby rysować z innym kolorem tekstu w zależności od stylu tła.

+0

W tableView: viewForTableColumn: row: delegate method Robię to, aby ustawić kolor pola tekstowego w mojej komórce opartej na widoku: cell.textField! .textColor = NSColor.redColor(). Komórki ustawione na blackColor() invert just fine, ale redColor() nie. Twoja odpowiedź zajmie trochę czasu, więc dziękuję za udzielenie mi pomysłów. –

+0

Stary, sprawdzę, ale jeśli to działa, jesteś moim wybawcą !! AppKit jest tak dziwny, gdy przychodzi od UIKit :) – Frizlab

+0

Działa! \ o/Awesome. – Frizlab

4

Za pomocą odpowiedzi Kena (powyżej) udało mi się go uruchomić. Oto brulion, że robi to, co chcę go do:

import Cocoa 

class CustomTextFieldCell: NSTextFieldCell { 

    // When the background changes (as a result of selection/deselection) switch appropriate colours 
    override var backgroundStyle: NSBackgroundStyle { 
     didSet { 
      if (backgroundStyle == NSBackgroundStyle.Dark) { 
       if self.textColor == NSColor.redColor() { 
        self.textColor = NSColor.yellowColor() 
       } 
      } else if (backgroundStyle == NSBackgroundStyle.Light) { 
       if (self.textColor == NSColor.yellowColor()) { 
        self.textColor = NSColor.redColor() 
       } 
      } 
     } 
    } 

    // When the colour changes, switch to a better alternative for the cell's current background 
    override var textColor: NSColor? { 
     didSet { 
      if let colour = self.textColor { 
       if backgroundStyle == NSBackgroundStyle.Dark { 
        if self.textColor == NSColor.redColor() { 
         self.textColor = NSColor.yellowColor() 
        } 
       } else if backgroundStyle == NSBackgroundStyle.Light { 
        if (self.textColor == NSColor.yellowColor()) { 
         self.textColor = NSColor.redColor() 
        } 
       } 
      } 
     } 
    } 

} 

Jeśli mogę ustawić CustomTextFieldCell jako niestandardowej klasy dla mojego widoku tabeli komórki w Inspektorze tożsamości, to działa. Potrzebowałem dodać obserwatora właściwości dla textColor, tak aby wiersze, które są aktualnie podświetlone, były traktowane tak samo. Mogę to teraz zmienić, aby nie było trudno zakodowane, ale to pokazuje tę koncepcję.

Dzięki Ken.

Powiązane problemy