Предложения пользовательской клавиатуры IOS с помощью 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);

}

Последние две строки — оператор печати для двух типов. Один предназначен для угадывания слов в случае ошибки, а другой — для словарных слов. Массив arrPredictiveText содержит слова, расположенные последовательно, как в словаре.

Пожалуйста, дайте какую-нибудь идею или способ решения предложения и механизма прогнозирования следующего слова для пользовательской клавиатуры ios, такой как другие приложения. Любая помощь или предложение будут оценены.


person Syed Sadrul Ullah Sahad    schedule 11.09.2017    source источник


Ответы (1)


Отвечая на мой собственный вопрос, я нашел немного лучший способ для предложения. Это может помочь другим.

// Улучшение предложения

+ (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... с входной строкой, вы получите хорошие предложения в завершении блока в виде массива предлагаемых строк.

person Syed Sadrul Ullah Sahad    schedule 17.01.2018