NSTextField-Texto blanco sobre fondo negro, pero cursor negro


He configurado un NSTextField con el color del 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.

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

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

Author: JJD, 2010-02-13

7 answers

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

 16
Author: Robert Karl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-13 16:53:13

Dado que en la práctica el NSText * devuelto por-currentEditor para un NSTextField es siempre un NSTextView*, agregué el siguiente código a mi subclase personalizada NSTextField:

-(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 mover esto a NSCell, que sería más limpio ya que NSCell es el que hace el dibujo y conoce los colores de todos modos.

 29
Author: uliwitness,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-02 12:01:49

Color del punto de inserción del Campo de texto

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

NSTextView *fieldEditor = (NSTextView*)[textField.window fieldEditor:YES
                                                           forObject:textField];
fieldEditor.insertionPointColor = insertionPointColor;
 26
Author: Zelko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-03 09:11:47

Suponiendo que usted está queriendo establecer el color del cuidado de inserción y no el cursor del ratón, entonces la sugerencia de usar setInsertionPointColor: debería funcionar.

Sin embargo, no necesariamente necesita cambiar de usar NSTextField a NSTextView. El editor de campos para la ventana en la que se encuentra NSTextField es un NSTextView. Así que cuando su NSTextField se convierte en la vista de teclas, podría agarrar el editor de campos y llamar a setInsertionPointColor: en eso. Es posible que deba restablecer el color cuando su campo deje de ser la vista de clave.

Puede obtener el editor de campos usando NSWindow's fieldEditor:forObject: o NSCell's fieldEditorForView:.

Si tienes una subclase de NSTextField puedes hacer que use una subclase personalizada de NSTextFieldCell y override -(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 campos esté activo para este campo de texto. Sin embargo, cuando el editor de campos se mueve a otro campo de edición, el color del punto de inserción permanecerá a menos que lo restablezca.

 11
Author: Jon Steinmetz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-25 21:16:57

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é no se puede establecer el color de fondo cuando haga esto en la clase derivada como con el textColor. Eso permitiría deshacerse de la variable IBOutlet y la variable miembro.

 2
Author: JJD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:25:51

He llamado {[2] {} en[3]} y la aplicación se bloquea.

Arreglé esto llamando a insertionPointColor en viewDidAppear.

Para Swift desarrolladores:

Establecer el método insertionPointColor en la 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)
    }
 2
Author: Gent Berani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-21 21:51:01

Solución Swift 4

override func viewDidAppear() {
    super.viewDidAppear()
    guard let window = _textField.window, let fieldEditor = window.fieldEditor(true, for: _textField) as? NSTextView else { return }
    fieldEditor.insertionPointColor = .white
}
 1
Author: Charlton Provatas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-10 22:16:59