2012-11-29 2 views
8

Кто-нибудь знает какой-либо класс или lib, которые могут реализовать автозаполнение до NSTextField?NSTextField autocomplete

Я пытаюсь заставить стандартное автозаполнение работать, но оно сделано как синхронный апи. Я получаю слова автозаполнения через вызов api через Интернет.

Что я сделал до сих пор является:

- (void)controlTextDidChange:(NSNotification *)obj 
{ 
    if([obj object] == self.searchField) 
    { 
     [self.spinner startAnimation:nil]; 
     [self.wordcompletionStore completeString:self.searchField.stringValue]; 

     if(self.doingAutocomplete) 
      return; 
     else 
     { 
      self.doingAutocomplete = YES; 
      [[[obj userInfo] objectForKey:@"NSFieldEditor"] complete:nil]; 
     } 
    } 
} 

Когда мой магазин будет сделано, я есть делегат, который вызывается:

- (void) completionStore:(WordcompletionStore *)store didFinishWithWords:(NSArray *)arrayOfWords 
{ 
    [self.spinner stopAnimation:nil]; 
    self.completions = arrayOfWords; 
    self.doingAutocomplete = NO; 
} 

Код, который возвращает список завершения в nstextfield is:

- (NSArray *)control:(NSControl *)control textView:(NSTextView *)textView completions:(NSArray *)words forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(NSInteger *)index 
{ 
    *index = -1; 
    return self.completions; 
} 

Моя проблема в том, что это всегда будет 1 запрос позади и список завершения o nly показывает на каждом втором символе, который вводит пользователь.

Я попытался найти Google и SO как сумасшедший, но я не могу показаться, чтобы найти какие-либо решения ..

Любая помощь очень ценится.

ответ

9

Вместо того, чтобы иметь значение boolean propertyAutocomplete, сделайте свойство своим контролем, выполнившим запрос. Давайте назовем это autoCompleteRequestor:

@property (strong) NSControl* autoCompleteRequestor; 

Так где вы установите текущее doingAutocomplete свойства в YES, вместо того, чтобы хранить ссылку на ваш контроль.

- (void)controlTextDidChange:(NSNotification *)obj 
{ 
    if([obj object] == self.searchField) 
    { 
     [self.spinner startAnimation:nil]; 
     [self.wordcompletionStore completeString:self.searchField.stringValue]; 

     if(self.autoCompleteRequestor) 
      return; 
     else 
     { 
      self.autoCompleteRequestor = [[obj userInfo] objectForKey:@"NSFieldEditor"]; 
     } 
    } 
} 

Теперь, когда ваш веб-запрос завершен, вы можете позвонить: на свой сохраненный объект.

- (void) completionStore:(WordcompletionStore *)store didFinishWithWords:(NSArray *)arrayOfWords 
{ 
    [self.spinner stopAnimation:nil]; 
    self.completions = arrayOfWords; 
    if (self.autoCompleteRequestor) 
    { 
     [self.autoCompleteRequestor complete:nil]; 
     self.autoCompleteRequestor = nil; 
    } 
} 
+0

Я проверю ваше решение, когда вернусь к своему коду. –

+1

Он отлично работал. Я просто изменил if-statematement, чтобы проверить self.autoCompleteRequestor вместо self.doingAutocomplete. Этот boolean var больше не нужен. Еще раз спасибо! –

-1

NSTextView имеет функциональность завершения слов частичных слов.

Посмотрите на documentation для этого компонента. Возможно, вы можете переключиться на этот компонент в своем приложении.

+0

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

Смежные вопросы