Метод делегата автозаполнения NSTextField не вызван - PullRequest
8 голосов
/ 02 апреля 2011

Я добавил следующий метод делегата для NSTextField, чтобы добавить поддержку автозаполнения:

- (NSArray *)control:(NSControl *)control
            textView:(NSTextView *)textView
         completions:(NSArray *)words
 forPartialWordRange:(NSRange)charRange
 indexOfSelectedItem:(NSInteger *)index

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

1 Ответ

7 голосов
/ 03 апреля 2011

Вам нужно будет вызвать complete: в текстовом поле редактор полей в какой-то момент. Это то, что вызывает меню завершения, но оно не вызывается автоматически. Если у вас нет F5, связанного с чем-либо, попробуйте ввести свое поле и нажмите его. Завершение должно вызвать тогда; Option-Esc также может работать.

Если вы хотите авто завершение, это займет некоторую работу. Вы можете начать с чего-то вроде этого:

- (void)controlTextDidChange:(NSNotification *)note {
    if( amDoingAutoComplete ){
        return;
    } else {
        amDoingAutoComplete = YES;
        [[[note userInfo] objectForKey:@"NSFieldEditor"] complete:nil];
    }
}

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

Очевидно, вам нужно будет сбросить флаг в какой-то момент. Это будет зависеть от того, как вы хотите обрабатывать взаимодействие пользователя с автозаполнением - вероятно, будет только одно завершение для заданной начальной строки, или пользователю нужно будет продолжать печатать, чтобы сузить возможности (в этом случае вам понадобится снова вызвать автозаполнение)?

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

...