objective-c - 使自动完成不区分大小写

标签 objective-c macos cocoa

我正在为 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/

相关文章:

ios - 枚举 UITableViewCell

iphone - 解决多标签问题

ios - 如何从 swift 类到 Objective C 类访问变量

objective-c - ios10:viewDidLoad 框架宽度/高度未正确初始化

macos - 强制VM以32位模式启动WebStart JNLP

objective-c - 将视频帧绘制为 GL_TEXTURE_RECTANGLE_EXT 或 GL_TEXTURE_2D

macos - 当两个 macOS .plugin 依赖于同一个 .dylib 并且每个都将它分别捆绑在插件文件夹中时会发生什么?

c - 如何在 Mac 终端中运行源代码?

cocoa - 从 Cocoa 中的 WebView 获取源 HTML

objective-c - Cocoa 随处搜索文件