NSTextField - белый текст на черном фоне, но черный курсор - PullRequest
25 голосов
/ 13 февраля 2010

Я установил NSTextField с белым цветом текста и цветом фона (черным, несмотря на то, что цвет фона не отображается, поэтому он прозрачный). Все в Интерфейсном Разработчике.

Проблема, с которой я столкнулся, заключается в том, что курсор черный и едва видимый . Разве курсор не отображает цвет текста? Есть идеи, как это исправить?

В противном случае NSTextField выглядит так, как будто его нельзя редактировать.

Ответы [ 7 ]

30 голосов
/ 02 февраля 2012

Поскольку на практике NSText *, возвращаемый -currentEditor для NSTextField, всегда является NSTextView *, я добавил следующий код в свой пользовательский подкласс 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;
}

Так что, если вы уже заменяете этот класс, потому что вы делаете пользовательское рисование фона, это может быть более инкапсулированное решение. Может быть, есть даже способ перенести это в NSCell, что будет чище, так как NSCell - это тот, кто рисует и в любом случае знает цвета.

28 голосов
/ 30 апреля 2012

Цвет точки вставки TextField

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

NSTextView *fieldEditor = (NSTextView*)[textField.window fieldEditor:YES
                                                           forObject:textField];
fieldEditor.insertionPointColor = insertionPointColor;
18 голосов
/ 13 февраля 2010

Лучше всего использовать NSTextView и - (void)setInsertionPointColor:(NSColor *)color.

14 голосов
/ 14 февраля 2010

Если вы хотите установить цвет вставляемой каретки, а не курсора мыши, тогда предложение использования setInsertionPointColor: должно сработать.

Однако вам не обязательно переходить с использования NSTextField на NSTextView. Редактор поля для окна, в котором находится NSTextField, является NSTextView. Поэтому, когда ваш NSTextField становится ключевым видом, вы можете взять редактор поля и вызвать setInsertionPointColor: для этого. Возможно, вам придется сбросить цвет, когда ваше поле перестает быть ключевым видом.

Вы можете получить редактор поля, используя NSWindow fieldEditor:forObject: или NSCell fieldEditorForView:.

Если у вас есть подкласс NSTextField, вы можете использовать собственный подкласс NSTextFieldCell и переопределить -(NSText*)setUpFieldEditorAttributes:(NSText*)textObj. В этом методе вы можете установить цвет точки вставки один раз, и он останется, пока редактор поля активен для этого текстового поля. Хотя при перемещении редактора полей в другое поле редактирования цвет точки вставки останется, если вы не сбросите его.

2 голосов
/ 11 июля 2018

Решение 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
}
2 голосов
/ 01 августа 2017

Я позвонил insertionPointColor в viewDidLoad и приложение вылетает.

Я исправил это, вызвав insertionPointColor на viewDidAppear.

Для Swift Разработчики:

Установить метод inserttionPointColor в расширение:

extension NSTextField {
    public func customizeCursorColor(_ cursorColor: NSColor) {
        let fieldEditor = self.window?.fieldEditor(true, for: self) as! NSTextView
        fieldEditor.insertionPointColor = cursorColor
    }
}

и звоните

 override func viewDidAppear() {
        super.viewDidAppear()
        textField.customizeCursorColor(NSColor.red)
    }
2 голосов
/ 03 января 2012

Вдохновленный великим ответом Jon Steinmetz Я создал следующий пример.

Я добавил NSSecureTextField в представление приложения и подключил его к IBOutlet переменной-члена, которую я поместил в AppDelegate.

@implementation AppDelegate

@synthesize password = m_password;

- (void)awakeFromNib {
    assert(m_password);
    self.password.backgroundColor = [NSColor blackColor];
}

Затем я создал пользовательский класс NSSecureTextField. Я заметил, что в некоторых случаях недостаточно установить цвета в awakeFromNib, но я не могу объяснить причину этого.

@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

Примечание: Хотя я не понимаю, почему цвет фона не может быть установлен, когда я делаю это в производном классе, как в textColor. Это позволило бы избавиться от IBOutlet и переменной-члена.

...