Фальсифицирование NSTextField с помощью NSTextView для получения хорошей окраски?

При попытке изменить выбранный текстовый цвет фона для NSTextField (у нас есть темный UI, и выбранный фон текста является почти тем же как самим текстом), но только NSTextView, кажется, позволяет нам изменять это.

Таким образом, мы пытаемся фальсифицировать NSTextField с помощью NSTextView, но не можем заставить текстовую прокрутку работать то же.

Самое близкое, которое мы получаем, с этим кодом:

NSTextView *tf = [ [ NSTextView alloc ] initWithFrame: NSMakeRect( 30.0, 20.0, 80.0, 22.0 ) ];

// Dark UI
[tf setTextColor:[NSColor whiteColor]];
[tf setBackgroundColor:[NSColor darkGrayColor]];

// Fixed size
[tf setVerticallyResizable:FALSE];
[tf setHorizontallyResizable:FALSE];

[tf setAlignment:NSRightTextAlignment]; // Make it right-aligned (yup, we need this too)

[[tf textContainer] setContainerSize:NSMakeSize(2000, 20)]; // Try to Avoid line wrapping with this ugly hack
[tf setFieldEditor:TRUE]; // Make Return key accept the textfield

// Set text properties
NSMutableDictionary *dict = [[[tf selectedTextAttributes] mutableCopy ] autorelease];
[dict setObject:[NSColor orangeColor] forKey:NSBackgroundColorAttributeName];
[tf setSelectedTextAttributes:dict];

Это работает почти хорошо, за исключением того, что, если текст длиннее, чем текстовое поле, Вы не можете прокрутить к нему всегда.

Какая-либо идея как, как выполнить это?

Заранее спасибо

Править: Решение, предложенное ниже Joshua Nozzi

Благодаря Joshua это - отличное решение того, что я искал:

@interface ColoredTextField : NSTextField
- (BOOL)becomeFirstResponder;
@end

@implementation ColoredTextField
- (BOOL)becomeFirstResponder
{
    if (![super becomeFirstResponder])
        return NO;

    NSDictionary * attributes = [NSDictionary dictionaryWithObjectsAndKeys : 
                     [NSColor orangeColor], NSBackgroundColorAttributeName, nil];

    NSTextView * fieldEditor = (NSTextView *)[[self window] fieldEditor:YES forObject:self];
    [fieldEditor setSelectedTextAttributes:attributes];
    return YES;
}
@end

Вместо того, чтобы фальсифицировать его с NSTextView, он - просто NSTextField, который изменяет выбранный цвет текста, когда это становится первым респондентом.

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

@interface ColoredTextField : NSTextField
- (BOOL)becomeFirstResponder;
- (void)textDidEndEditing:(NSNotification *)notification;

- (void)setSelectedColor;
@end

@implementation ColoredTextField
- (BOOL)becomeFirstResponder
{
    if (![super becomeFirstResponder])
        return NO;
    [self setSelectedColor];
    return YES;
}

- (void)textDidEndEditing:(NSNotification *)notification
{
    [super textDidEndEditing:notification];
    [self setSelectedColor];
}

- (void) setSelectedColor
{
    NSDictionary * attributes = [NSDictionary dictionaryWithObjectsAndKeys : 
                                [NSColor orangeColor], NSBackgroundColorAttributeName, nil];

    NSTextView * fieldEditor = (NSTextView *)[[self window] fieldEditor:YES forObject:self];
    [fieldEditor setSelectedTextAttributes:attributes];
}
@end
9
задан Community 23 May 2017 в 02:23
поделиться

1 ответ

Почему бы просто не установить свойства редактора поля текстового поля напрямую, когда поле становится первым респондентом ?

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

NSDictionary * attributes = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSColor orangeColor], NSBackgroundColorAttributeName, nil];
NSTextView * fieldEditor = (NSTextView *)[[self window] fieldEditor:YES 
    forObject:textField];
[fieldEditor setSelectedTextAttributes:attributes];

Примечание: Как обсуждается в комментариях ниже, в документации правильно сказано, что редактор поля является экземпляром NSTextView, но метод - [NSWindow fieldEditor: forObject:] утверждает, что вернуть NSText (непосредственный суперкласс NSTextView).Если вы планируете отправить редактору поля методы, предназначенные только для NSTextView, вам необходимо преобразовать его как NSTextView, чтобы заглушить предупреждения компилятора. Приведение ничего не сломает в вашем коде, если прототип метода будет исправлен в будущем, поэтому его можно безопасно оставить на месте.

7
ответ дан 3 November 2019 в 04:40
поделиться