2010-02-13 23 views
21

He configurado un NSTextField con color de texto como blanco, y el color de fondo como (negro a pesar de no representar el color de fondo, por lo que es transparente). Todo en Interface Builder.NSTextField - Texto blanco sobre fondo negro, pero cursor negro

El problema que tengo es el cursor es negro, y apenas visible. ¿El cursor no representa el color del texto? ¿Alguna idea de cómo puedo solucionar esto?

De lo contrario, el NSTextField parece que no se puede editar.

Respuesta

16

Su mejor opción es probablemente usar NSTextView y - (void)setInsertionPointColor:(NSColor *)color.

+2

No. La mejor apuesta es a la subclase NSTextField, según lo descrito por uliwitness, abajo. – Bryan

11

Suponiendo que desea establecer el color del cursor de inserción y no el cursor del mouse, la sugerencia de usar setInsertionPointColor: debería funcionar.

Sin embargo, no es necesario que cambie de usar NSTextField a NSTextView. El editor de campo para la ventana en la que se encuentra el NSTextField es un NSTextView. Entonces, cuando su NSTextField se convierta en la vista clave, puede tomar el editor de campo y llamar al setInsertionPointColor: sobre eso. Es posible que deba restablecer el color cuando su campo deje de ser la vista clave.

que pueda obtener el editor de campo mediante el uso de NSWindow 's fieldEditor:forObject: o NSCell' s fieldEditorForView:.

Si usted tiene una subclase de NSTextField se puede tener usar una subclase personalizada de NSTextFieldCell y anular -(NSText*)setUpFieldEditorAttributes:(NSText*)textObj. En ese método, puede establecer el color del punto de inserción una vez y permanecerá mientras el editor de campo esté activo para este campo de texto. Sin embargo, cuando el editor de campo se mueve a otro campo de edición, el color del punto de inserción permanecerá a menos que lo restablezca.

+0

genial, no sabía que esto funcionó. –

+0

Esta es una forma fantástica de cambiar el color del punto de inserción en un NSSecureTextField. ¡Gracias! –

+0

Pero 'fieldEditor: forObject:' devuelve un objeto 'NSText'. No puedo llamar 'setInsertionPointColor:' en un 'NSText'. – JJD

2

Inspirado por la gran respuesta de Jon Steinmetz He creado el siguiente ejemplo.

Agregué un NSSecureTextField a la vista de la aplicación y lo conecté al IBOutlet de la variable miembro que coloqué en AppDelegate.

@implementation AppDelegate 

@synthesize password = m_password; 

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

Luego creé una clase personalizada NSSecureTextField. Me di cuenta de que en algunos casos no es suficiente para establecer los colores en awakeFromNib pero no puedo dar una razón para esto.

@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 

Nota: Sin embargo, no entiendo por qué el color de fondo no se puede ajustar cuando hago esto en la clase derivada igual que con el textColor. Eso permitiría deshacerse de IBOutlet y la variable miembro.

+0

es probable que valga la pena invocar la implementación de 'super' de las funciones que está anulando. – Vince

26

Dado que en la práctica el NSText * devuelto por -currentEditor para una NSTextField es siempre una NSTextView *, he añadido el código siguiente para mi costumbre NSTextField subclase:

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

Así que si ya está reemplazando esta clase porque está haciendo un dibujo de fondo personalizado, esta podría ser una solución más encapsulada. Tal vez incluso hay una manera de llevar esto a NSCell, que sería más limpio ya que NSCell es quien hace el dibujo y conoce los colores de todos modos.

+1

Esto realmente debería marcarse como la respuesta correcta; el uso de los métodos de delegado 'textDidBegin/end:' como se propone en otras respuestas no cambia el color de intercalación hasta que el usuario comienza a escribir. Éste lo cambia inmediatamente en foco. – Bryan

+2

Es posible que desee agregar un método '- (BOOL) resignFirstResponder' correspondiente que cambie el color a negro, ya que el editor de campo en cuestión es compartido por todos los campos de texto en la ventana. Dejarlo en blanco probablemente no sea una buena idea, ya que otros campos no lo configurarán automáticamente en negro. – Bryan

+0

Tenga en cuenta que resignFirstResponder no funcionará en este caso porque se llamará inmediatamente después de becomeFirstResponder cuando el editor de campo se convierta en el primero en responder. –

24

TextField punto de inserción color

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

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

funcionó a la perfección! –

+2

@Zelko Dvorak ¡Impresionante! – atomikpanda

+1

solo asegúrate de llamarlo en viewDidAppear porque fieldEditor seguirá siendo nulo en viewDidLoad o viewWillAppear –

1

He llamado insertionPointColor en viewDidLoad y aplicación falla.

Lo arreglé llamando al insertionPointColor en viewDidAppear.

Para Swift desarrolladores:

defina Método insertionPointColor en extensión:

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

y llamar

override func viewDidAppear() { 
     super.viewDidAppear() 
     textField.customizeCursorColor(NSColor.red) 
    } 
Cuestiones relacionadas