Какой объект использовать для специального редактирования текста - PullRequest
1 голос
/ 19 декабря 2010

Мне нужно специальное текстовое поле, которое должно выполнять следующие действия:

  • многострочный
  • поддержка клавиши табуляции
  • отправлять действие при нажатии клавиши ввода
  • alt + ввод для новой строки
  • shift + ввод для новой строки

я не знаю, что использовать.

NSTextView выглядит хорошо, но я не могу установить действие при вводе, и нажатие клавиши ввода приводит к появлению новой строки

NSTextField не поддерживает клавиши табуляции и Shift-Enter не работает.

Есть идеи?спасибо!

1 Ответ

5 голосов
/ 19 декабря 2010

Лучше всего подкласс NSTextView, чтобы получить функциональность, которую вы хотите. Вот быстрый пример:

MyTextView.h

@interface MyTextView : NSTextView
{
    id target;
    SEL action;
}
@property (nonatomic, assign) id target;
@property (nonatomic, assign) SEL action;
@end

MyTextView.m

@implementation MyTextView

@synthesize target;
@synthesize action;

- (void)keyDown:(NSEvent *)theEvent
{
    if ([theEvent keyCode] == 36) // enter key
    {
        NSUInteger modifiers = [theEvent modifierFlags];
        if ((modifiers & NSShiftKeyMask) || (modifiers & NSAlternateKeyMask))
        {
            // shift or option/alt held: new line
            [super insertNewline:self];
        }
        else
        {
            // straight enter key: perform action
            [target performSelector:action withObject:self];
        }
    }
    else
    {
        // allow NSTextView to handle everything else
        [super keyDown:theEvent];
    }
}

@end

Установка цели и действия будут выполняться следующим образом:

[myTextView setTarget:someController];
[mytextView setAction:@selector(omgTheUserPressedEnter:)];

Подробнее о кодах клавиш и полном наборе NSResponder сообщений, таких как insertNewline:, см. В прекрасных ответах на мой вопрос о NSEvent кодах клавиш: Где я могу найти список кодов клавиш для использования с классом какао NSEvent?

...