NSTableView (представление на основе) с пользовательскими цветами текста и правильным редактированием цвета текста - PullRequest
0 голосов
/ 25 февраля 2019

Изменение цвета текста в NSTableView на основе представления может быть выполнено с помощью пользовательского представления ячейки таблицы и реализации setBackgroundStyle:

- (void)setBackgroundStyle: (NSBackgroundStyle)backgroundStyle {
  [super setBackgroundStyle: backgroundStyle];

  UICoverageElement *element = self.objectValue;

  if (backgroundStyle == NSBackgroundStyleEmphasized) {
    self.textField.textColor = NSColor.highlightColor;
  } else {
    if ([element.value isEqualToString: @"<no name>"]) {
      self.textField.textColor = NSColor.tertiaryLabelColor;
    } else if ([element.value hasPrefix: @"UI"]) {
      self.textField.textColor = typeColor;
    } else if ([element.value hasPrefix: @"["] || [element.value hasPrefix: @"{"]) {
      self.textField.textColor = objectColor;
    } else {
      self.textField.textColor = NSColor.textColor;
    }
  }
}

Это хорошо работает:

enter image description here

, но вызывает проблемы при редактировании ячейки.В этом случае редактор полей, очевидно, берет текущий заданный вручную цвет текста (белый для выбранной строки) и показывает его в редакторе полей с белым фоном:

enter image description here

Теперь вопрос: как установить правильный цвет текста при редактировании представления ячейки?

setBackgroundStyle не вызывается при запуске редактирования, что делает невозможным решение этой проблемыв этой функции.Я пробовал различные методы, которые указывают на начало процесса редактирования, но ни один не вызывается (но являются для автономных текстовых полей).Когда я не устанавливаю highlightColor, тогда цвет редактора правильный, но тогда цвет подсветки выбранной строки неправильный.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Честно говоря, это одна из тех вещей, которые, как вы думаете, будут действительно простыми и понятными, и на самом деле это, к сожалению, нет.

Единственные способы повлиять на цвет в редакторе полей, это либо:

a) Установите цвет вашего текстового поля на нужный цвет перед вызовом метода selectWithFrame: ... в NSCell b) Измените цвет текста, помещенного в редактор полей после вызова selectWithFrame: ....

Так обычно:

a) подкласс NSTextFieldCell и установите цвет текста поля обратно к обычному значению по умолчанию до . Редактор поля настроен.

- (void)selectWithFrame:(NSRect)rect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)delegate start:(NSInteger)selStart length:(NSInteger)selLength
{
    self.textColorWhenNotEditing = self.textColor;
    self.textColor = NSColor.controlTextColor;
    [super selectWithFrame:rect inView:controlView editor:textObj delegate:delegate start:selStart length:selLength];
}

- (void)endEditing:(NSText *)textObj
{
    [super endEditing:textObj];
    self.textColor = self.textColorWhenNotEditing;
}

b) Изменить редактор полей напрямую

- (void)selectWithFrame:(NSRect)rect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)delegate start:(NSInteger)selStart length:(NSInteger)selLength
{
    [super selectWithFrame:rect inView:controlView editor:textObj delegate:delegate start:selStart length:selLength];

    NSMutableDictionary * attribs = [((NSTextView *)textObj).typingAttributes mutableCopy];
    attribs[NSForegroundColorAttributeName] = NSColor.controlTextColor;

    [((NSTextView *)textObj).textStorage setAttributes:attribs range:NSMakeRange(0, textObj.string.length)];
    ((NSTextView *)textObj).typingAttributes = attribs;
}
0 голосов
/ 25 февраля 2019

Я ранее ответил на связанный вопрос.Не уверен, следует ли пометить это как дубликат: https://stackoverflow.com/a/54217318/217306

Суть в том, что режим редактирования текста обрабатывается отдельным объектом, который называется field editor.Вы должны создать новый экземпляр и использовать его для настройки внешнего вида во время редактирования вашей таблицы.

windowWillReturnFieldEditor Метод делегата NSWindow спрашивает, какой редактор использовать для редактирования client.Вы создаете такой редактор один раз для своей таблицы и возвращаете его, когда делегат запрашивает редактор для вашей таблицы.

- (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)client {

    if (/* client is a textfield or subview in your table */) {
        // Create customEditor elsewhere once
        // Get row number or data that corresponds to client view
        // Cusomize customEditor colors accordingly
        return customEditor;
    }

    return nil; // Use default editor
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...