2010-02-13 17 views
21

Ustawiłem NSTextField z kolorem tekstu jako białego, a kolor tła jako (czarny, mimo że nie renderuje koloru tła, więc jest przezroczysty). Wszystko w Interface Builder.NSTextField - Biały tekst na czarnym tle, ale czarny kursor

Problem, który mam, to kursor jest czarny i prawie niewidoczny. Czy kursor nie reprezentuje koloru tekstu? Jakieś pomysły, jak to naprawić?

W przeciwnym razie NSTextField wygląda na to, że nie można go edytować.

Odpowiedz

16

Najlepiej jest użyć NSTextView i - (void)setInsertionPointColor:(NSColor *)color.

+2

nr Najlepszym kandydatem jest do podklasy NSTextField, jak opisana przez uliwitness, poniżej. – Bryan

11

Zakładając, że chcesz ustawić kolor kreski wstawiania, a nie kursora myszy, powinna zadziałać sugestia użycia setInsertionPointColor:.

Jednak nie trzeba koniecznie zmienić korzystania z NSTextField na NSTextView. Edytor pól dla okna, w którym znajduje się NSTextField, to NSTextView. Więc kiedy twój NSTextField stanie się kluczowym widokiem, możesz pobrać edytor pól i zadzwonić pod numer setInsertionPointColor:. Konieczne może być zresetowanie koloru, gdy pole przestanie być widokiem kluczowym.

można uzyskać za pomocą edytora pola przez NSWindow 's fieldEditor:forObject: lub NSCell' s fieldEditorForView:.

Jeśli masz podklasę NSTextField, możesz użyć niestandardowej podklasy NSTextFieldCell i przesłonić -(NSText*)setUpFieldEditorAttributes:(NSText*)textObj. W tej metodzie można ustawić kolor punktu wstawiania jeden raz i pozostanie on, gdy edytor pól jest aktywny dla tego pola tekstowego. Chociaż kiedy edytor pól zostanie przeniesiony do innego pola edycyjnego, kolor punktu wstawienia pozostanie, chyba że go zresetujesz.

+0

fajne, nie wiedziałem, że to zadziałało. –

+0

To jest fantastyczny sposób na zmianę koloru punktu wstawienia na NSSecureTextField. Dzięki! –

+0

Ale 'fieldEditor: forObject:' zwraca obiekt 'NSText'. Nie mogę wywołać 'setInsertionPointColor:' na 'NSText'. – JJD

2

Zainspirowany wielką odpowiedzią Jon Steinmetz stworzyłem następujący przykład.

Dodałem NSSecureTextField do widoku aplikacji i podłączyłem go do IBOutlet zmiennej składowej, którą umieściłem w AppDelegate.

@implementation AppDelegate 

@synthesize password = m_password; 

- (void)awakeFromNib { 
    assert(m_password); 
    self.password.backgroundColor = [NSColor blackColor]; 
} 

Następnie utworzyłem niestandardową klasę NSSecureTextField. Zauważyłem, że w niektórych przypadkach nie wystarczy ustawić kolory w awakeFromNib, ale nie mogę podać powodu.

@implementation CustomSecureTextField 

- (void)customize { 
    // Customize the text and caret color. 
    NSColor* foregroundColor = [NSColor whiteColor]; 
    self.textColor = foregroundColor; 
    [[self.cell fieldEditorForView:self] setInsertionPointColor:foregroundColor]; 
} 

- (void)awakeFromNib { 
    [self customize]; 
} 

- (void)textDidBeginEditing:(NSNotification*)notification { 
    // Called when the user inputs a character. 
    [self customize]; 
} 

- (void)textDidEndEditing:(NSNotification*)notification { 
    // Called when the user clicks into the field for the first time. 
    [self customize]; 
} 

- (void)textDidChange:(NSNotification*)notification { 
    // Just in case ... for the paranoid programmer! 
    [self customize]; 
} 


@end 

Uwaga: Chociaż, ja nie rozumiem, dlaczego kolor tła nie można ustawić, gdy zrobić to w klasie pochodnej jak z textColor. To pozwoliłoby pozbyć się zmiennej IBOutlet i składowej.

+0

Warto chyba nazwać 'super' implementacją funkcji, które nadpisujesz. – Vince

26

Ponieważ w praktyce NSText * zwrócony przez -currentEditor dla NSTextField jest zawsze NSTextView * I dodaje następujący kod do mojego niestandardowego NSTextField podklasy:

-(BOOL) becomeFirstResponder 
{ 
    BOOL success = [super becomeFirstResponder]; 
    if(success) 
    { 
     // Strictly spoken, NSText (which currentEditor returns) doesn't 
     // implement setInsertionPointColor:, but it's an NSTextView in practice. 
     // But let's be paranoid, better show an invisible black-on-black cursor 
     // than crash. 
     NSTextView* textField = (NSTextView*) [self currentEditor]; 
     if([textField respondsToSelector: @selector(setInsertionPointColor:)]) 
      [textField setInsertionPointColor: [NSColor whiteColor]]; 
    } 
    return success; 
} 

Więc jeśli jesteś już zastąpienie tej klasy ponieważ robisz niestandardowy rysunek tła, może to być bardziej zamknięte rozwiązanie. Może jest nawet sposób na przeniesienie tego do NSCell, który byłby czystszy, ponieważ NSCell jest tym, który wykonuje rysunek i zna kolory.

+1

To powinno być naprawdę oznaczone jako poprawna odpowiedź; używanie metod delegowania 'textDidBegin/end:', jak proponowano w innych odpowiedziach, nie zmienia koloru karetki, dopóki użytkownik nie zacznie pisać. Ten zmienia go natychmiast po ustawieniu ostrości. – Bryan

+2

Możesz dodać odpowiednią metodę '- (BOOL) resignFirstResponder', która zmieni kolor z powrotem na czarny, ponieważ dany edytor pól jest współużytkowany przez wszystkie pola tekstowe w oknie. Pozostawienie go w kolorze białym prawdopodobnie nie jest dobrym pomysłem, ponieważ inne pola nie ustawią go automatycznie na czarny. – Bryan

+0

Należy zauważyć, że polecenie resignFirstResponder nie będzie działać w tym przypadku, ponieważ zostanie ono wywołane zaraz po fakcie, gdy edytor pól stanie się pierwszym obiektem odpowiadającym. –

24

TextField Punkt wstawienia Kolor

NSTextField *textField = self.textField; 
NSColor *insertionPointColor = [NSColor blueColor]; 

NSTextView *fieldEditor = (NSTextView*)[textField.window fieldEditor:YES 
                  forObject:textField]; 
fieldEditor.insertionPointColor = insertionPointColor; 
+2

działało idealnie! –

+2

@Zelko Dvorak Awesome! – atomikpanda

+1

po prostu upewnij się, że wywołasz go w viewDidAppear przyczyną poleEditor będzie nadal zero w viewDidLoad lub viewWillAppear –

1

Zadzwoniłem insertionPointColor w viewDidLoad i aplikacji awarii.

Naprawiłem to, dzwoniąc pod numer insertionPointColor pod numerem viewDidAppear.

Dla Swift deweloperzy:

Ustaw metodę insertionPointColor do rozszerzenia:

extension NSTextField { 
    public func customizeCursorColor(_ cursorColor: NSColor) { 
     let fieldEditor = self.window?.fieldEditor(true, for: self) as! NSTextView 
     fieldEditor.insertionPointColor = cursorColor 
    } 
} 

i nazywają

override func viewDidAppear() { 
     super.viewDidAppear() 
     textField.customizeCursorColor(NSColor.red) 
    } 
Powiązane problemy