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.

¿Fue útil?

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)
    }
}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top