seguro repente queda pro prende pero pantalla negro negra modo macbook mac imac enciende objective-c macos cocoa customization nstextfield

objective-c - repente - modo seguro mac



NSTextField-Texto blanco sobre fondo negro, pero cursor negro (7)

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;

He configurado un campo de NSTextField con el color del texto en blanco, y el color de fondo como (negro a pesar de no mostrar el color de fondo, por lo que es transparente). Todo en Interface Builder.

El problema que tengo es que 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, parece que NSTextField no puede editarse.


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

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

Entonces, 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 haya incluso una manera de subir esto a NSCell, lo que sería más limpio ya que NSCell es el que hace el dibujo y conoce los colores de todos modos.


He llamado insertionPointColor en viewDidLoad y la aplicación se bloquea.

viewDidAppear esto llamando a insertionPointColor en viewDidAppear .

Para los desarrolladores de Swift :

Establecer el 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 llama

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


Inspirado por la gran respuesta de Jon Steinmetz , creé el siguiente ejemplo.

NSSecureTextField 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 . Noté que en algunos casos no es suficiente para configurar 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 hago esto en la clase derivada como con el textColor . Eso permitiría deshacerse del IBOutlet y la variable miembro.


Probablemente lo mejor sea usar NSTextView y - (void)setInsertionPointColor:(NSColor *)color .


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

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

Puede obtener el editor de campos utilizando fieldEditor:forObject: o NSCell ''s fieldEditorForView:

Si tiene una subclase de NSTextField, puede hacer que use 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. Aunque cuando el editor de campo se mueva a otro campo de edición, el color del punto de inserción permanecerá a menos que lo restablezca.


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 }