如何在iOS8自定义键盘中使用自动更正和快捷方式列表?
我想用自定义键盘和默认英文键盘使用自动更正和快捷方式列表。 我检查键盘文件,但不知道如何使用它。
在键盘文件 。
每个自定义键盘(独立于其RequestsOpenAccess键的值)都可以通过UILexicon类访问基本的自动纠正词典。 利用这个课程以及您自己devise的词典,在用户input文字时提供build议和自动更正。 UILexicon对象包含来自各种来源的单词,其中包括:
- 来自用户的地址簿数据库的不成对的名字和姓氏
- 在设置>常规>键盘>快捷方式列表中定义的文本快捷方式
- 一个常用的字典
如何在Objective-C中访问我们的字典中的快捷方式列表和input?
如何使用UILexicon和requestSupplementaryLexiconWithCompletion?
实现词典看起来非常像这样:
- 使用
requestSupplementaryLexiconWithCompletion()
来获取一次启动词典。 - input每种types的文本,将其添加到
NSString
(跟踪当前单词) - 当用户按下空格(终止字)检查string反对词典
- 如果是匹配,则计数字符数并删除该字符数
- input词典build议的build议
- 清除string,然后重新开始
另外,您还可以使用UITextChecker
提供更高级的自动更正function。
代码(在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的经验
关于自动更正,我可以使用链接添加它。 这里是我从链接中使用的代码片段:
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]];
苹果的完整文档可以在这里find。
虽然我没有亲自尝试创build一个自定义键盘,但我将这个答案基于我可以在文档中看到。
在您的键盘上,创build一个名为[AnyObject]
(AnyObjects数组)的entries
的属性。
在你的init
方法中,或者你创build键盘的地方,调用这个方法:
requestSupplementaryLexiconWithCompletion(completionHandler: { lexicon in self.entries = lexicon.entries })
我怀疑这些entries
实际上是一个string或NSString的数组,但它可能是一个字典或其他types。 在进行testing时,在确定逻辑之前,试着弄清楚实际包含的是什么types。
我不相信目前有一种方法可以获得苹果的默认自动更正选项。 不过,这次WWDC的演讲让我们深入了解了他们如何在原有的iPhone操作系统(30分钟左右)中自动完成自动更正。
他提到使用数组的二进制search,这导致我相信这个数组是sorting的。 当然,自从第一款iPhone上市以来,很多事情可能已经改变了。
祝你好运搞清楚这个新的API!
这是您实际访问词典的方式:
[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
词典。 利用这个课程以及您自己devise的词典,在用户input文字时提供build议和自动更正。 UILexicon对象包含来自各种来源的单词,其中包括:
用户地址簿数据库中未配对的名字和姓氏在设置>常规>键盘>快捷方式列表中定义的文本快捷键包含苹果产品名称的常用单词字典
如果有人还在研究这个问题,我发现了一个非常好的C ++预测文本库Presage 。 在演示的基础上,它似乎做得很好,但是我试图把它作为一个库集成起来很麻烦( 在这里看到我的问题)。
让我知道如果有人有任何想法,非常感兴趣,让这个工作!
实际上, 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!”),但不是拼写方面的自动更正。
您可以使用下面的自动更正逻辑,它也将在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]; }