NSTextField - El texto blanco sobre fondo negro, pero negro cursor
-
20-09-2019 - |
Pregunta
he configurar un NSTextField
con el color de texto como el blanco y el color de fondo (negro a pesar de no hacer que el color de fondo, por lo que su transparente). En el Interface Builder.
El problema que estoy teniendo es el cursor es negro, y apenas visible . ¿El cursor no representar el color del texto? ¿Alguna idea de cómo puedo solucionar este problema?
De lo contrario, el NSTextField
parece que no se puede editar.
Solución
Su mejor apuesta es probablemente usar NSTextView y - (void)setInsertionPointColor:(NSColor *)color
.
Otros consejos
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ás haciendo dibujo de fondo personalizado, esto podría ser una solución más encapsulado. Tal vez incluso hay una manera de mover esto en NSCell, lo que sería más limpio desde NSCell es el que hace el dibujo y conocer los colores de todos modos.
TextField punto de inserción del color
NSTextField *textField = self.textField;
NSColor *insertionPointColor = [NSColor blueColor];
NSTextView *fieldEditor = (NSTextView*)[textField.window fieldEditor:YES
forObject:textField];
fieldEditor.insertionPointColor = insertionPointColor;
Si se asume que usted está deseando establecer el color del punto de inserción y no el cursor del ratón a continuación, la sugerencia de utilizar setInsertionPointColor:
debería funcionar.
Sin embargo, no necesariamente tienen que cambiar el uso de NSTextField
a NSTextView
. El editor de campo para la ventana que el NSTextField
está en una NSTextView
. Así que cuando su NSTextField
se convierte en la clave de vista se podía agarrar el editor de campo y llamar a setInsertionPointColor:
en eso. Es posible que deba reiniciar el color cuando su campo deja de ser el punto de vista clave.
Usted puede obtener el editor de campo mediante el uso de NSWindow
fieldEditor:forObject:
o NSCell
de fieldEditorForView:
.
Si usted tiene una subclase de NSTextField usted puede tener que utilizar una subclase personalizada de NSTextFieldCell y anular -(NSText*)setUpFieldEditorAttributes:(NSText*)textObj
. En ese método se puede establecer el color del punto de inserción una vez y se mantendrá mientras el editor de campo se encuentra activo para este campo de texto. Aunque cuando el editor de campo se traslada a otro campo de edición el color punto de inserción se mantendrá a menos que se restablece el usuario.
Inspirado por la gran respuesta de Jon Steinmetz que crearon el siguiente ejemplo.
I añadido un NSSecureTextField
a la vista de aplicación y conectado a la IBOutlet
de la variable miembro coloqué en AppDelegate
.
@implementation AppDelegate
@synthesize password = m_password;
- (void)awakeFromNib {
assert(m_password);
self.password.backgroundColor = [NSColor blackColor];
}
Entonces creó una clase NSSecureTextField
personalizado. Me di cuenta de que es en algunos casos no es suficiente para establecer los colores en awakeFromNib
pero no puedo dar una razón para ello.
@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: Aunque, 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 la IBOutlet
y la variable miembro.
He llamado insertionPointColor
en viewDidLoad
y aplicación falla.
He arreglado esto llamando insertionPointColor
en viewDidAppear
.
Swift los desarrolladores:
Establecer 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 la llamada
override func viewDidAppear() {
super.viewDidAppear()
textField.customizeCursorColor(NSColor.red)
}
Swift 4 Solución
override func viewDidAppear() {
super.viewDidAppear()
guard let window = _textField.window, let fieldEditor = window.fieldEditor(true, for: _textField) as? NSTextView else { return }
fieldEditor.insertionPointColor = .white
}
Si utiliza Objective-C captura selector de tiempo de ejecución combinada con una solución de uliwitness , se puede lograr sin la subclasificación NSTextField, aquí yo uso methodInvoked
de RxCocoa como un ejemplo:
import Cocoa
import RxCocoa
extension NSTextField {
func withCursorColor(_ color: NSColor) {
rx.methodInvoked(#selector(becomeFirstResponder))
.subscribe(onNext: { [unowned self] _ in
guard let editor = self.currentEditor() as? NSTextView else { return }
editor.insertionPointColor = color
})
.disposed(by: rx.disposeBag)
}
}