2012-11-29 176 views
8

有誰知道可以實現自動完成到NSTextField的任何類或lib?NSTextField自動完成

我試圖讓標準autocmpletion工作,但它是作爲一個同步api。我通過互聯網上的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是:

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

我的問題是,這將始終是1請求後面和完成列表o只有在用戶輸入的每個第二個字符上纔會顯示。

我試圖搜索谷歌和SO像個瘋子一樣,但我似乎無法找到任何解決方案..

任何幫助深表感謝。

回答

9

而不是使布爾屬性doingAutocomplete,使該屬性您的控件發出請求。讓我們把它叫做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"]; 
     } 
    } 
} 

現在,當您的網絡請求完成後,您可以在存儲的對象上調用complete:。

- (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-statemate來檢查self.autoCompleteRequestor而不是self.doingAutocomplete。這個布爾變量不再需要。再次感謝! –

-1

NSTextView具有完成部分單詞的功能。

查看該組件的documentation。 也許你可以在你的應用程序中切換到這個組件。

+0

好吧。問題在於,默認實現期望在用戶鍵入單詞幾秒後獲得建議的同時獲得其結果。 –