Как использовать автокоррекцию и список ярлыков в пользовательской клавиатуре iOS8?
Я хочу использовать автокоррекцию и список ярлыков, таких как английская клавиатура по умолчанию, с моей пользовательской клавиатурой.
Я проверяю документ с клавиатуры, но не знаю, как его использовать.
В документации по клавиатуре.
Каждая пользовательская клавиатура (независимо от значения ее ключа RequestsOpenAccess) имеет доступ к базовой лексике автокоррекции через класс UILexicon. Используйте этот класс вместе с лексиконом вашего собственного дизайна, чтобы предлагать предложения и автокоррекции, когда пользователи вводят текст. Объект UILexicon содержит слова из разных источников, в том числе:
- Непарные имена и фамилии из базы данных адресной книги пользователей
- Текстовые ярлыки, определенные в меню "Настройки" > "Основные" > "Клавиатура" > "Ярлыки"
- Словарь общедоступных слов
Как получить доступ к списку ярлыков и вводам из нашего словаря в Objective-C?
Как использовать UILexicon с requestSupplementaryLexiconWithCompletion?
Ответы
Ответ 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];
}