2010-02-13 18 views
21

Ich habe eine NSTextField mit Textfarbe als weiß, und die Hintergrundfarbe als (schwarz trotz nicht die Hintergrundfarbe, so dass es transparent). Alles im Interface Builder. Das Problem, das ich habe ist der Cursor ist schwarz und kaum sichtbar. Entspricht der Cursor nicht der Textfarbe? Irgendwelche Ideen, wie ich das beheben kann?NSTextField - Weißer Text auf schwarzem Hintergrund, aber schwarzer Cursor

Ansonsten sieht die NSTextField so aus, als ob sie nicht bearbeitet werden kann.

Antwort

16

Ihre beste Wette ist wahrscheinlich, NSTextView und - (void)setInsertionPointColor:(NSColor *)color zu verwenden.

+2

No. Die beste Wette NSTextField Unterklasse ist nennen, wie uliwitness beschrieben, unten. – Bryan

11

Angenommen, Sie möchten die Farbe des Einfügezeichens und nicht den Mauszeiger festlegen, dann sollte der Vorschlag, setInsertionPointColor: zu verwenden, funktionieren.

Sie müssen jedoch nicht unbedingt von NSTextField zu NSTextView wechseln. Der Feldeditor für das Fenster, in dem sich die NSTextField befindet, ist eine NSTextView. Wenn Ihre NSTextField die Schlüsselansicht wird, können Sie den Feldeditor verwenden und setInsertionPointColor: darauf aufrufen. Möglicherweise müssen Sie die Farbe zurücksetzen, wenn Ihr Feld nicht mehr die Schlüsselansicht ist.

Sie können das Feld Editor erhalten, indem NSWindow 's fieldEditor:forObject: oder NSCell' s fieldEditorForView: verwenden. Wenn Sie eine Unterklasse von NSTextField haben, können Sie eine benutzerdefinierte Unterklasse von NSTextFieldCell verwenden und die -(NSText*)setUpFieldEditorAttributes:(NSText*)textObj überschreiben. In dieser Methode können Sie die Einfügepunktfarbe einmal festlegen, und sie bleibt bestehen, während der Feld-Editor für dieses Textfeld aktiv ist. Wenn der Feldeditor jedoch in ein anderes Bearbeitungsfeld verschoben wird, bleibt die Einfügepunktfarbe erhalten, sofern Sie sie nicht zurücksetzen.

+0

cool, ich wusste nicht, das hat funktioniert. –

+0

Dies ist eine fantastische Möglichkeit, die Einfügepunktfarbe auf einem NSSecureTextField zu ändern. Vielen Dank! –

+0

Aber 'fieldEditor: forObject:' gibt ein 'NSText' Objekt zurück. Ich kann 'setInsertionPointColor:' nicht auf 'NSText' aufrufen. – JJD

2

Inspiriert von der großen Antwort von Jon Steinmetz habe ich das folgende Beispiel erstellt.

Ich fügte eine NSSecureTextField der Anwendungsansicht hinzu und verband sie mit der IBOutlet der Mitgliedsvariablen, die ich in AppDelegate platzierte.

@implementation AppDelegate 

@synthesize password = m_password; 

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

Dann habe ich eine benutzerdefinierte NSSecureTextField Klasse. Mir ist aufgefallen, dass es in einigen Fällen nicht reicht, die Farben in awakeFromNib einzustellen, aber ich kann keinen Grund dafür nennen.

@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 

Hinweis: Obwohl, ich verstehe nicht, warum die Hintergrundfarbe nicht eingestellt werden kann, wenn ich es wie mit den textColor in der abgeleiteten Klasse zu tun. Das würde erlauben, die IBOutlet und die Mitgliedsvariable loszuwerden.

+0

ist es wahrscheinlich wert, die Super-Implementierung der Funktionen, die Sie überschreiben, aufzurufen. – Vince

26

in der Praxis Da die NSText * zurück von -currentEditor für eine NSTextField ist immer ein NSTextView *, habe ich den folgenden Code zu meinen benutzerdefinierten NSTextField Unterklasse:

-(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; 
} 

Also, wenn Sie bereits diese Klasse ersetzt Da es sich um eine benutzerdefinierte Hintergrundzeichnung handelt, könnte dies eine besser gekapselte Lösung sein. Vielleicht gibt es sogar eine Möglichkeit, dies in NSCell zu verschieben, was sauberer wäre, da NSCell derjenige ist, der die Zeichnung macht und sowieso die Farben kennt.

+1

Dies sollte wirklich als die richtige Antwort markiert werden; Mit den 'textDidBegin/end:' Delegate-Methoden, wie in anderen Antworten vorgeschlagen, ändert sich die Caret-Farbe erst, wenn der Benutzer mit der Eingabe beginnt. Dieser ändert es sofort im Fokus. – Bryan

+2

Möglicherweise möchten Sie eine entsprechende '- (BOOL) resignFirstResponder'-Methode hinzufügen, die die Farbe zurück in schwarz ändert, da der betreffende Feldeditor von allen textFields im Fenster verwendet wird. Es ist wahrscheinlich keine gute Idee, es auf Weiß zu belassen, da andere Felder es nicht automatisch auf Schwarz setzen. – Bryan

+0

Beachten Sie, dass resignFirstResponder in diesem Fall nicht funktioniert, da er direkt nach dem beforeFirstResponder aufgerufen wird, wenn der Feld-Editor zum Ersthelfer wird. –

24

TextField- Einfügepunkt Farbe

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

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

hat perfekt funktioniert! –

+2

@Zelko Dvorak Super! – atomikpanda

+1

nur stellen Sie sicher, dass Sie es in ViewDidAppear aufrufen Ursache FeldEditor wird immer noch nil in ViewDidLoad oder viewWillAppear –

1

Ich habe insertionPointColor in viewDidLoad und App-Abstürze genannt.

Ich habe dies durch Aufruf insertionPointColor auf viewDidAppear behoben.

Für Swift Entwickler:

Set insertionPointColor Methode in Verlängerung:

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

und

override func viewDidAppear() { 
     super.viewDidAppear() 
     textField.customizeCursorColor(NSColor.red) 
    } 
Verwandte Themen