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
}