如何在iOS8自定义键盘中使用自动更正和快捷列表?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在iOS8自定义键盘中使用自动更正和快捷列表?相关的知识,希望对你有一定的参考价值。
我想使用自定义和快捷列表,如我的自定义键盘默认英语键盘。我检查键盘文档,但不知道如何使用它。
每个自定义键盘(独立于其RequestsOpenAccess键的值)都可以通过UILexicon类访问基本的自动更正词典。利用此类以及您自己设计的词典,在用户输入文本时提供建议和自动更正。 UILexicon对象包含来自各种来源的单词,包括:
- 来自用户的地址簿数据库的不成对的名字和姓氏
- “设置”>“常规”>“键盘”>“快捷方式”列表中定义的文本快捷方式
- 常用词典
如何在Objective-C中访问我们字典中的快捷列表和输入?
如何在requestSupplementaryLexiconWithCompletion中使用UILexicon?
实现词典看起来非常像这样:
- 使用
requestSupplementaryLexiconWithCompletion()
在启动一次后获取词典。 - 输入每种类型的文本将其添加到
NSString
(跟踪当前单词) - 当用户按空格(当前单词的结尾)时,检查字符串对着词典
- 如果是匹配计数字符数并删除该字符数
- 输入词典建议的建议
- 清除字符串并重新开始
此外,您还可以使用UITextChecker
提供更高级的自动更正功能。
代码(在Objective-C中,这可能不是我在公共汽车上写的那样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的完整文档可以在here找到。
虽然我没有亲自尝试创建自定义键盘,但我的答案基于我在文档中看到的内容。
在键盘中,创建一个名为entries
的属性,类型为[AnyObject]
(Array of AnyObjects)。
在init
方法中,或者在您创建键盘的任何位置,请调用此方法:
requestSupplementaryLexiconWithCompletion(completionHandler: {
lexicon in
self.entries = lexicon.entries
})
我怀疑entries
实际上是一个字符串或NSStrings数组,但它可能是字典或其他类型。在测试时,尝试确定entries
中实际包含的类型,然后再计算出你的逻辑。
我不相信目前有办法获得Apple的默认自动更正选项。然而,这个WWDC talk提供了有关他们如何在原始iPhone操作系统中进行自动更正工作的洞察力(大约30分钟)。
他提到使用数组的二进制搜索,这让我相信这个数组是有序的。当然,自从第一款iPhone发布以来,可能会发生很大变化......
祝你好运这个新的API!
这是您实际访问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);
}
}];
每个自定义键盘(独立于其RequestsOpenAccess键的值)都可以通过UILexicon
类访问基本的自动更正词典。利用此类以及您自己设计的词典,在用户输入文本时提供建议和自动更正。 UILexicon对象包含来自各种来源的单词,包括:
用户通讯簿数据库中未配对的名字和姓氏设置>常规>键盘>快捷方式列表中定义的文本快捷方式包含Apple产品名称的常用字词字典
如果有人还在研究这个问题,我发现了一个非常好的C ++预测文本库,名为Presage。它似乎在演示基础上做得很好,但我在尝试将其集成为库时遇到了很多麻烦(请参阅我的问题here)。
让我知道是否有人有任何想法,非常有兴趣让这个工作!
实际上,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];
}
Rachits在swift 4中回答上述问题。适用于iOS 12
我有这个帮助器来检查UITextChecker要测试的当前字符串是不是空格
func validate(string: String?) -> Bool {
guard let text = string,
!text.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).isEmpty else {
return false
}
return true
}
文本检查器然后在我的“空格键”,“空格键双击”和“返回”方法中。下面的例子是我的“太空”方法
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 {
以上是关于如何在iOS8自定义键盘中使用自动更正和快捷列表?的主要内容,如果未能解决你的问题,请参考以下文章