[英]How to use autocorrection and shortcut list in iOS8 custom keyboard?
我想将自动更正和快捷方式列表(例如默认的英文键盘)与我的自定义键盘一起使用。 我检查了键盘上的文档,但不知道如何使用。
在键盘文档中 。
每个自定义键盘(独立于其RequestsOpenAccess键的值)都可以通过UILexicon类访问基本的自动更正词典。 利用该类以及您自己设计的词典,在用户输入文本时提供建议和自动更正。 UILexicon对象包含来自各种来源的单词,包括:
如何在Objective-C中从字典访问快捷方式列表和输入?
如何将UILexicon与requestSupplementaryLexiconWithCompletion一起使用?
实施词典的方式看起来非常像这样:
requestSupplementaryLexiconWithCompletion()
一次启动即可获取词典。 NSString
(跟踪当前单词) 此外,您还可以使用UITextChecker
提供更多高级自动更正功能。
代码(在Objective-C中,这可能不是我在总线上用SO写的100%准确,但应该可以):
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的个人经验
关于自动校正,我可以使用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的完整文档可在此处找到。
尽管我还没有亲自尝试创建自定义键盘,但是我将根据文档中的内容给出此答案。
在键盘上,创建一个名为[AnyObject]
类型的entries
的属性[AnyObject]
数组)。
在您的init
方法中或您创建键盘的任何地方,请调用此方法:
requestSupplementaryLexiconWithCompletion(completionHandler: {
lexicon in
self.entries = lexicon.entries
})
我怀疑entries
实际上是String或NSString的数组,但它可能是字典或其他某种类型。 测试时,请先弄清楚entries
实际包含的类型,然后再弄清楚逻辑。
我不认为目前有办法获取Apple的默认自动更正选项。 但是,此WWDC演讲提供了有关它们如何在原始iPhone操作系统(约30分钟标记)中自动校正工作的见解。
他提到使用二进制搜索数组,这使我相信该数组已排序。 当然,自第一部iPhone问世以来,可能已经发生了很多变化...
祝您好运!
这是您实际上可以访问词典词的方式:
[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);
}
}];
每个自定义键盘(独立于其RequestsOpenAccess键的值)都可以通过UILexicon
类访问基本的自动UILexicon
词典。 利用该类以及您自己设计的词典,在用户输入文本时提供建议和自动更正。 UILexicon对象包含来自各种来源的单词,包括:
用户地址簿数据库中不成对的名字和姓氏在“设置”>“常规”>“键盘”>“快捷方式”列表中定义的文本快捷方式包含苹果产品名称的常用单词词典
实际上, UILexicon
只是获取拼写检查系统不应该尝试修复的一些用户特定单词的方法。 可能最常用的使用方法是填写UITextChecker
的忽略单词列表。
let lexicon: UILexicon = ...
let checker: UITextChecker = ...
for entry in lexicon.entries {
if entry.documentText == entry.userInput {
checker.ignoreWord(entry.documentText)
}
}
另外, UILexicon
可以用作自动替换的快捷方式的来源,例如(“ omw” =“我在路上!”),但是就拼写而言,它不是自动更正。
您可以对自动更正使用以下逻辑,它也可以在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];
}
Rachits迅速回答了以上问题4。适用于iOS 12
我有这个助手来检查是否要由UITextChecker测试的当前字符串不是空格
func validate(string: String?) -> Bool {
guard let text = string,
!text.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).isEmpty else {
return false
}
return true
}
然后,在我的“空格键”,“双击空格键”和“返回”方法中使用文本检查器。 下面的示例在我的“ Space”方法中
let textChecker = UITextChecker()
let currentString = self.textDocumentProxy.documentContextBeforeInput
if validate(string: currentString) {
let charSet = NSCharacterSet.whitespacesAndNewlines
let components = currentString?.components(separatedBy: charSet)
let lastWord = components?.last
let checkRange = NSMakeRange(0, lastWord?.count ?? 0)
let misspelledRange = textChecker.rangeOfMisspelledWord(in: lastWord!, range: checkRange, startingAt: checkRange.location, wrap: false, language: "en_US")
if misspelledRange.length != 0 {
let guessedWord: Array = textChecker.guesses(forWordRange: misspelledRange, in: lastWord!, language: "en_US")!
if guessedWord.count > 0 {
var i = 0
while (lastWord?.length)! > i {
textDocumentProxy.deleteBackward()
i += 1
}
self.textDocumentProxy.insertText(guessedWord[0])
}
}
}
self.textDocumentProxy.insertText(" ")
我必须对Rachits代码进行两项更改。 首先验证currentString,因为如果您按两次空格键会抛出异常。 其次要检查拼写错误的范围是否不为0,因为这也引发了一个异常,我还没有弄清楚为什么。 但这对我现在仍然有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.