Какао: остановка редактора полей от автозаполнения на клавишу пробела - PullRequest
4 голосов
/ 22 марта 2012

У меня есть пользовательское представление с несколькими NSTextField элементами управления, для которых я хочу предоставить пользовательские автозаполнения, и я успешно реализовал все это с использованием протокола NSTextFieldDelegate.Автозаполнения - это полные имена или географические названия, в зависимости от того, какое текстовое поле редактируется.

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

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

Может кто-нибудь подсказать, как этого добиться?

1 Ответ

6 голосов
/ 29 марта 2012

Я признаю, что довольно долго занимался этим вопросом, прежде чем Я нашел приемлемый ответ через Google-фу. Магический код, явно украденный у первоначального ответчика:

@interface MLFieldEditor : NSTextView @end

@implementation MLFieldEditor


-  (void)insertCompletion:(NSString *)word forPartialWordRange:(NSRange)charRange movement:(NSInteger)movement isFinal:(BOOL)flag {
    // suppress completion if user types a space
    if (movement == NSRightTextMovement) return;

    // show full replacements
    if (charRange.location != 0) {
        charRange.length += charRange.location;
        charRange.location = 0;
    }

    [super insertCompletion:word forPartialWordRange:charRange movement:movement isFinal:flag];

    if (movement == NSReturnTextMovement)
    {
        [[NSNotificationCenter defaultCenter] postNotificationName:MLSearchFieldAutocompleted object:self userInfo:nil];
    } }

@end

( Дополнительная справка )

...