Ras*_*yrk 8 cocoa autocomplete objective-c nstextfield
有没有人知道任何可以实现NSTextField自动完成的类或库?
我试图让标准的自动完成工作,但它是作为一个同步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];
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我的商店完成后,我有一个被调用的委托:
- (void) completionStore:(WordcompletionStore *)store didFinishWithWords:(NSArray *)arrayOfWords
{
[self.spinner stopAnimation:nil];
self.completions = arrayOfWords;
self.doingAutocomplete = NO;
}
Run Code Online (Sandbox Code Playgroud)
将完成列表返回到nstextfield的代码是:
- (NSArray *)control:(NSControl *)control textView:(NSTextView *)textView completions:(NSArray *)words forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(NSInteger *)index
{
*index = -1;
return self.completions;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,这将始终是1个请求,完成列表仅显示用户输入的每个第2个字符.
我试图搜索谷歌和SO像疯子一样,但我似乎无法找到任何解决方案..
任何帮助深表感谢.
不要让布尔属性为doneAutocomplete,而是将属性作为发出请求的控件.我们称之为autoCompleteRequestor:
@property (strong) NSControl* autoCompleteRequestor;
Run Code Online (Sandbox Code Playgroud)
因此,您将当前属性doesAutocomplete设置为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"];
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当您的Web请求完成后,您可以在存储的对象上调用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;
}
}
Run Code Online (Sandbox Code Playgroud)