Перехват действий Keydown в NSTextFieldCell

У меня есть основанный на ячейке NSOutlineView, который отображает NSTextFieldCell объекты.

Я хотел бы реагировать на события keydown или keyup, чтобы сделать текст, содержащийся в NSTextFieldCell, жирным шрифтом, когда текст содержит определенные предустановленные ключевые слова. Каков самый элегантный способ добиться этого - должен ли я:

  • Подкласс NSOutlineView и переопределение метода нажатия клавиши
  • Подкласс NSTextFieldCell
  • Использовать какой-либо делегат
  • Используйте другой подход

Заранее всем большое спасибо за любую информацию!


person VikR    schedule 15.07.2013    source источник
comment
Э-э, может быть, мне следовало перефразировать вопрос, чтобы ограничить его особым запросом первоначального автора, а не расширять его щедростью. Слишком поздно.   -  person Thomas Tempelmann    schedule 20.03.2017


Ответы (2)


Нашел.

В режиме бодрствования от Nib:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(actionToTakeOnKeyPress:)  name:NSControlTextDidChangeNotification object:theNSOutlineViewThatContainsTheNSTextFieldCell]; 

Затем добавьте такой метод:

- (void) actionToTakeOnKeyPress: (id) sender
{
    //will be called whenever contents of NSTextFieldCell change
}
person VikR    schedule 16.07.2013
comment
У меня тот же вопрос, но ваш ответ не подходит, потому что это уведомление вызывается ПОСЛЕ того, как набранный ключ уже обработан текстовым полем. Мне нужно перехватить нажатие клавиши раньше и при желании отбросить его, чтобы оно не попало в текстовое поле. Для этого, согласно документам, keyDown должен быть перезаписан, что я не могу понять для NSTextFieldCell. - person Thomas Tempelmann; 20.03.2017

Чтобы перехватывать нажатия клавиш таким образом, чтобы их можно было отфильтровать, различные сообщения NSResponder могут быть перезаписаны, например keyDown: или interpretKeyEvents:.

Чтобы сделать это, в качестве редактора поля необходимо использовать подкласс NSTextView. Для этого один подкласс NSTextFieldCell и переопределяет fieldEditorForView:, возвращая подкласс (см. Редактор настраиваемого поля для NSTextFieldCell в NSTableView).

Вот соответствующие фрагменты кода:

В подклассе NSTextFieldCell (который затем должен быть назначен в Interface Builder для редактируемого столбца или возвращен сообщением dataCellForTableColumn NSTableViewDelegate):

- (NSTextView *)fieldEditorForView:(NSView *)aControlView
{
    if (!self.myFieldEditor) {
        self.myFieldEditor = [[MyTextView alloc] init];
        self.myFieldEditor.fieldEditor = YES;
    }
    return self.myFieldEditor;    
}

Также требуется объявление свойства в разделе @interface:

@property (strong) MyTextView *myFieldEditor;

А затем в MyTextView, который является подклассом NSTextView:

-(void)keyDown:(NSEvent *)theEvent
{
    NSLog(@"MyTextView keyDown: %@", theEvent.characters);
    static bool b = true;
    if (b) { // this silly example only lets every other keypress through.
        [super keyDown:theEvent];
    }
    b = !b;
}
person Thomas Tempelmann    schedule 20.03.2017
comment
Опять же, извините за открытие награды, но затем публикую свое собственное решение. Все это заняло у меня более 4 часов, чтобы понять, и в середине этого я подумал, что не могу найти решение, поэтому я начал награду слишком рано. И я не могу вернуть это сейчас. - person Thomas Tempelmann; 20.03.2017