2017-09-11 81 views
0

在这里,我到目前为止。我有一个函数接收一个字符串并向我显示一些关于我的自定义键盘的建议。iOS自定义键盘建议与UITextChecker

- (空)suggestionsForCustomKeyboard:(的NSString *)字{

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自定义键盘的建议和下一个词预测机制。任何帮助或建议将不胜感激。

回答

0

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

//建议改进

+ (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 ...块与输入字符串你会得到很好的建议,分组完成的建议字符串数组。