IOS 使用 UITextChecker 的自定义键盘建议

IOS Custom Keyboard Suggestions with UITextChecker

我到这里为止。我有一个函数可以接收一个字符串并向我显示一些关于我的自定义键盘的建议。

-(void)suggestionsForCustomKeyboard:(NSString *)word{

NSArray *arrPredectiveText;
UITextChecker *checker = [[UITextChecker alloc] init];
NSLocale *currentLocale = [NSLocale currentLocale];
NSString *currentLanguage = [currentLocale objectForKey:NSLocaleLanguageCode];
NSRange searchRange = NSMakeRange(0, word.length);
arrPredectiveText = [checker completionsForPartialWordRange:searchRange inString:word language:currentLanguage];

NSArray *guesses = [NSArray array];

if ([currentString length] >= 1) {

    UITextChecker *textChecker = [[UITextChecker alloc] init];
    NSRange misspelledRange = [textChecker
                               rangeOfMisspelledWordInString:currentString
                               range:NSMakeRange(0, [currentString length])
                               startingAt:0
                               wrap:NO
                               language:@"en_US"];


    if (misspelledRange.location != NSNotFound) {

        guesses = [textChecker guessesForWordRange:misspelledRange
                                          inString:currentString
                                          language:@"en_US"];
        NSLog(@"First guess: %@", [guesses firstObject]);

    } else {
        NSLog(@"Textchecker Not found");
        autocorrectedText = @"";
    }

    if (arrPredectiveText.count >= 2){
        suggestionOne = [arrPredectiveText objectAtIndex:0];
        suggestionTwo = [arrPredectiveText objectAtIndex:1];
    }
    else if (arrPredectiveText.count == 1 && guesses.count >= 1) {
        suggestionOne = [arrPredectiveText firstObject];
        suggestionTwo = [guesses firstObject];
    }else if (arrPredectiveText.count == 0 && guesses.count > 0){
        suggestionOne = [guesses firstObject];
        if (guesses.count > 1) {
            suggestionTwo = [guesses objectAtIndex:1];
        }
    }

    NSLog(@"Textchecker all guess: %@", guesses);
    NSLog(@"Prediction: %@",arrPredectiveText);

}

最后两行是两种类型的打印语句。一种用于拼写错误时猜测单词,另一种用于字典单词。 arrPredectiveText 数组像字典一样按顺序包含单词。

请提供一些想法或方法来解决 ios 自定义键盘的建议和下一个单词预测机制,就像其他应用一样。任何帮助或建议将不胜感激。

回答我自己的问题,我发现了一个更好的建议方式。这可能会对其他人有所帮助。

// 建议改进

+ (void)getSuggestionsFor:(NSString *)word WithCompletion:(void(^)(NSArray *))completion
{
    //    NSLog(@"Current String %@",word);
    NSString *prefix;
    if ([word length] > 1) {
        prefix = [word substringToIndex:word.length - 1];
    }else{
        prefix = [word substringToIndex:word.length];
    }
    // Won't get suggestions for correct words, so we are scrambling the words
    //    NSLog(@"Prefix String %@",prefix);
    NSString *scrambledWord = [NSString stringWithFormat:@"%@%@",word, [self getRandomCharAsNSString]];
    //    NSLog(@"scrambledWord String %@",scrambledWord);
    UITextChecker *checker = [[UITextChecker alloc] init];
    NSRange checkRange = NSMakeRange(0, scrambledWord.length);
    NSRange misspelledRange = [checker rangeOfMisspelledWordInString:scrambledWord range:checkRange startingAt:checkRange.location wrap:YES  language:@"en_US"];

    NSArray *arrGuessed = [checker guessesForWordRange:misspelledRange inString:scrambledWord language:@"en_US"];
    //    NSLog(@"Guess Arr ===== %@",arrGuessed);
    // Filter the result based on the word
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF BEGINSWITH[c] %@",word];
    NSArray *arrayfiltered = [arrGuessed filteredArrayUsingPredicate:predicate];
    //    NSLog(@"1 arrayfiltered character %@",arrayfiltered);
    if(arrayfiltered.count == 0)
    {
        // Filter the result based on the prefix
        NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"SELF BEGINSWITH[c] %@",prefix];
        arrayfiltered = [arrGuessed filteredArrayUsingPredicate:newPredicate];
        //        NSLog(@"2 arrayfiltered character %@",arrayfiltered);
    }
    if (arrayfiltered.count == 0) {

        NSArray *arrPredectiveText;
        UITextChecker *checker = [[UITextChecker alloc] init];
        NSLocale *currentLocale = [NSLocale currentLocale];
        NSString *currentLanguage = [currentLocale objectForKey:NSLocaleLanguageCode];
        NSRange searchRange = NSMakeRange(0, word.length);
        arrPredectiveText = [checker completionsForPartialWordRange:searchRange inString:word language:currentLanguage];
        //        NSLog(@"3 arrayfiltered character %@",arrPredectiveText);

        if (arrPredectiveText.count == 0 && arrGuessed.count != 0) {
            completion(arrGuessed);
        }else{
            completion(arrPredectiveText);
        }
    }else{
        completion(arrayfiltered);
    }
}

+ (NSString *)getRandomCharAsNSString{
    NSString *str = [NSString stringWithFormat:@"%c", arc4random_uniform(26) + 'a'];
    //    NSLog(@"Random character %@",str);
    return str;
}

通过使用输入字符串调用此 getSuggestionsFor... 块,您将在块完成中获得作为建议字符串数组的良好建议。