Подтвердить что ты не робот

Как использовать автокоррекцию и список ярлыков в пользовательской клавиатуре iOS8?

Я хочу использовать автокоррекцию и список ярлыков, таких как английская клавиатура по умолчанию, с моей пользовательской клавиатурой. Я проверяю документ с клавиатуры, но не знаю, как его использовать.

В документации по клавиатуре.

Каждая пользовательская клавиатура (независимо от значения ее ключа RequestsOpenAccess) имеет доступ к базовой лексике автокоррекции через класс UILexicon. Используйте этот класс вместе с лексиконом вашего собственного дизайна, чтобы предлагать предложения и автокоррекции, когда пользователи вводят текст. Объект UILexicon содержит слова из разных источников, в том числе:

  • Непарные имена и фамилии из базы данных адресной книги пользователей
  • Текстовые ярлыки, определенные в меню "Настройки" > "Основные" > "Клавиатура" > "Ярлыки"
  • Словарь общедоступных слов

Как получить доступ к списку ярлыков и вводам из нашего словаря в Objective-C?

Как использовать UILexicon с requestSupplementaryLexiconWithCompletion?

4b9b3361

Ответ 1

Реализация лексики будет выглядеть примерно так:

  • Используйте requestSupplementaryLexiconWithCompletion(), чтобы получить лексикон после запуска один раз.
  • Вводится текст каждого типа, добавьте его в NSString (отслеживание текущего слова)
  • Когда пользователь нажимает пробел (конец текущего слова), проверьте строку на лексике
  • Если совпадение соответствует количеству символов и удаляет это число символов
  • Введите предложение, предложенное лексикой
  • Очистить строку и начать снова

Кроме того, вы можете также использовать UITextChecker, чтобы предлагать более совершенные функции автоматической настройки.

Код (в Objective-C, это не может быть на 100% точным, я написал в SO, пока на автобусе, но он должен это делать):

UILexicon *lexicon;
NSString *currentString;

-(void)viewDidLoad {
     [self requestSupplementaryLexiconWithCompletion:^(UILexicon *receivedLexicon) {
         self.lexicon = receivedLexicon;
     }];
}

-(IBAction)myTypingAction:(UIButton *)sender {
    [documentProxy insertText:sender.title]; 
    [currentString stringByAppendingString:sender.title];
}

-(IBAction)space {
   [documentProxy insertText:@" "];
   for (UILexiconEntry *lexiconEntry in lexicon.entries) {
       if (lexiconEntry.userInput isEqualToString:currentString) {
            for (int i = 0; currentString.length >=i ; i++) { 
                 [documentProxy deleteTextBackwards];
            }
            [documentProxy insertText:lexiconEntry.documentText];
            currentString = @"";  
        }
    } 
}

Не стесняйтесь комментировать, если у вас есть еще вопросы.

Источник: личный опыт работы с клавиатурами iOS 8 и UILexicon

Ответ 2

Что касается автоматической коррекции, я смог добавить его с помощью link. Здесь фрагмент кода, который я использовал по ссылке:

UITextChecker *checker = [[UITextChecker alloc] init];

  NSRange checkRange = NSMakeRange(0, self.txView.text.length);

  NSRange misspelledRange = [checker rangeOfMisspelledWordInString:self.txView.text 
                                                             range:checkRange
                                                        startingAt:checkRange.location
                                                              wrap:NO 
                                                          language:@"en_US"];

  NSArray *arrGuessed = [checker guessesForWordRange:misspelledRange inString:self.txView.text language:@"en_US"];

  self.txView.text = [self.txView.text stringByReplacingCharactersInRange:misspelledRange 
                                                               withString:[arrGuessed objectAtIndex:0]];

Полную документацию от Apple можно найти здесь.

Ответ 3

Хотя я лично не пытался создать пользовательскую клавиатуру, я основываю этот ответ на том, что я вижу в документации.

На вашей клавиатуре создайте свойство entries типа [AnyObject] (Array of AnyObjects).

В вашем методе init или везде, где вы создаете клавиатуру, вызовите этот метод:

requestSupplementaryLexiconWithCompletion(completionHandler: {
    lexicon in 
    self.entries = lexicon.entries
})

Я подозреваю, что entries на самом деле является массивом строк или NSStrings, но это может быть словарь или какой-либо другой тип. Когда вы проверите это, попробуйте выяснить, какой тип на самом деле содержится в entries, прежде чем вычислять вашу логику.

Я не верю, что есть возможность получить настройки автозамены Apple по умолчанию в настоящее время. Тем не менее, этот разговор WWDC дает представление о том, как они сделали автокорректную работу в оригинальной iPhone OS (около 30-минутной отметки).

Он упоминает использование двоичного поиска массива, что заставляет меня думать, что этот массив отсортирован. Конечно, многое могло измениться с момента выхода первого iPhone...

Удачи в разработке этого нового API!

Ответ 4

Таким образом вы можете фактически получить слова Lexicon:

[self requestSupplementaryLexiconWithCompletion:^(UILexicon *receivedLexicon) {
    self.lexicon = receivedLexicon;

    for (UILexiconEntry *word in self.lexicon.entries) {
        // Text to be inserted into a text input object by a custom keyboard, corresponding to the userInput value in the same lexicon entry.
        NSLog(@"%@",word.documentText);
        // Text to match, during user input, to provide appropriate output to a text document from the documentText value in the same lexicon entry.
        NSLog(@"%@",word.userInput);
    }
}];

Ответ 5

Каждая пользовательская клавиатура (независимо от значения ее ключа RequestsOpenAccess) имеет доступ к базовой лексике автокоррекции через класс UILexicon. Используйте этот класс вместе с лексиконом вашего собственного дизайна, чтобы предлагать предложения и автокоррекции, когда пользователи вводят текст. Объект UILexicon содержит слова из разных источников, в том числе:

Непарные имена и фамилии из базы данных адресной книги пользователей Текстовые ярлыки, определенные в меню "Настройки" > "Основные" > "Клавиатура" > "Ярлыки" Словарь общих слов, который включает названия продуктов Apple

Ответ 6

В случае, если кто-то все еще изучает это, я нашел действительно приятную интеллектуальную текстовую библиотеку С++, называемую Presage. Кажется, что это хорошо работает на основе демо, но у меня много проблем, пытаясь интегрировать его в библиотеку (см. Мой вопрос здесь).

Сообщите мне, есть ли у кого-нибудь идеи, очень заинтересованные в том, чтобы это работало!

Ответ 7

Фактически, UILexicon - это просто способ получить некоторые пользовательские слова, которые ваша система проверки орфографии не должна пытаться исправить. Вероятно, наиболее распространенный способ использовать это - заполнить список игнорируемых слов UITextChecker.

let lexicon: UILexicon = ...
let checker: UITextChecker = ...

for entry in lexicon.entries {
    if entry.documentText == entry.userInput {
        checker.ignoreWord(entry.documentText)
    }
}

Кроме того, UILexicon может использоваться как источник автозаменяемых ярлыков, таких как ( "omw" = "On my way!" ), но это не автокоррекция с точки зрения орфографии.

Ответ 8

Вы можете использовать нижеприведенную логику для AutoCorrect, и она также будет работать в iOS 10

-(void)didClickAtAlphaNumericKeyboardKey:(NSString *)value {

    if ([value isEqualToString:@" "]) {
            UITextChecker *checker = [[UITextChecker alloc] init];
            currentString = self.textDocumentProxy.documentContextBeforeInput;
            NSCharacterSet *charSet = [NSCharacterSet whitespaceAndNewlineCharacterSet];
            NSArray *components = [currentString componentsSeparatedByCharactersInSet:charSet];
            NSString *lastWord = components.lastObject;

            NSRange checkRange = NSMakeRange(0, lastWord.length);
            NSRange misspelledRange = [checker rangeOfMisspelledWordInString:lastWord
                                                                       range:checkRange
                                                                  startingAt:checkRange.location
                                                                        wrap:NO
                                                                    language:@"en_US"];

            NSArray *guessedWord = [checker guessesForWordRange:misspelledRange inString:lastWord language:@"en_US"];

            if (guessedWord && guessedWord.count > 0) {
                for (int i = 0; lastWord.length >i ; i++) {
                    [self.textDocumentProxy deleteBackward];
                }
                [self.textDocumentProxy insertText:[guessedWord objectAtIndex:0]];
            }
    }

    [self.textDocumentProxy insertText:value];
}