我正在为 OSX 应用程序在 cocoa 中实现自动完成功能,到目前为止我已经把它全部搞定了。一个挂断是自动完成是区分大小写的,这并不是我真正想要/需要的。理想情况下,自动完成将不区分大小写。相关代码如下:
@implementation autocompleteController
- (void)viewDidLoad {
[super viewDidLoad];
self.textField.delegate = self;
}
-(void)controlTextDidChange:(NSNotification *)obj{
NSTextView * fieldEditor = [[obj userInfo] objectForKey:@"NSFieldEditor"];
if (self.isAutocompleting == NO && !self.backspaceKey) {
self.isAutocompleting = YES;
self.lastEntry = [[[fieldEditor string] capitalizedString] copy];
[fieldEditor complete:nil];
self.isAutocompleting = NO;
}
if (self.backspaceKey) {
self.backspaceKey = NO;
}
}
-(NSArray *)control:(NSControl *)control textView:(NSTextView *)textView completions:(NSArray *)words forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(NSInteger *)index{
NSMutableArray * suggestions = [NSMutableArray array];
NSArray * possibleStrings = @[@"TEST", @"ABC", @"abc", @"amauroy", @"AMA", @"amazing"];
if (!self.lastEntry || !possibleStrings) {
return nil;
}
for (NSString * string in possibleStrings) {
if ([string hasPrefix:self.lastEntry]) {
[suggestions addObject:string];
}
}
return suggestions;
}
-(BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector{
if (commandSelector == @selector(deleteBackward:)) {
self.backspaceKey = YES;
}
return NO;
}
@end
最佳答案
正如 Pro Blaster 指出的那样,问题在于以下行:
if ([string hasPrefix:self.lastEntry]) {
您的自动完成功能区分大小写,因为 -hasPrefix:
区分大小写。一种方法是将所有内容转换为小写(当然,大写也可以)。另一种方法是编写一个不区分大小写的 -hasPrefix:
版本,并使用类别将其添加到 NSString
中,如下所示:
@interface NSString (autocomplete)
- (BOOL)hasPrefixIgnoringCase:(NSString*)aString;
@end;
@implementation NSString (autocomplete)
- (BOOL)hasPrefixIgnoringCase:(NSString*)aString
{
NSRange *prefix = [self rangeOfString:aString options:NSCaseInsensitiveSearch];
return prefix.location == 0 && prefix.length == aString.length;
}
@end
然后在代码中使用该方法:
if ([string hasPrefixIgnoringCase:self.lastEntry]) {
注意:提供的代码未经测试。这个概念很合理,但您可能会发现一两个语法错误。
关于objective-c - 使自动完成不区分大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34247631/