如何在iOS8自定义键盘中使用自动更正和快捷列表?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在iOS8自定义键盘中使用自动更正和快捷列表?相关的知识,希望对你有一定的参考价值。

我想使用自定义和快捷列表,如我的自定义键盘默认英语键盘。我检查键盘文档,但不知道如何使用它。

keyboard documentation

每个自定义键盘(独立于其RequestsOpenAccess键的值)都可以通过UILexicon类访问基本的自动更正词典。利用此类以及您自己设计的词典,在用户输入文本时提供建议和自动更正。 UILexicon对象包含来自各种来源的单词,包括:

  • 来自用户的地址簿数据库的不成对的名字和姓氏
  • “设置”>“常规”>“键盘”>“快捷方式”列表中定义的文本快捷方式
  • 常用词典

如何在Objective-C中访问我们字典中的快捷列表和输入?

如何在requestSupplementaryLexiconWithCompletion中使用UILexicon?

答案

实现词典看起来非常像这样:

  1. 使用requestSupplementaryLexiconWithCompletion()在启动一次后获取词典。
  2. 输入每种类型的文本将其添加到NSString(跟踪当前单词)
  3. 当用户按空格(当前单词的结尾)时,检查字符串对着词典
  4. 如果是匹配计数字符数并删除该字符数
  5. 输入词典建议的建议
  6. 清除字符串并重新开始

此外,您还可以使用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自定义键盘中使用自动更正和快捷列表?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 - 如何隐藏键盘上方的建议列表?

iOS 8 自定义键盘自动布局键

无法在 iOS8 自定义键盘中获得约束

如何检查我的 ios8 自定义键盘扩展是不是具有开放访问权限?

如何检查我的ios8自定义键盘扩展是否具有开放访问权限?

设备上的 iOS 8 自定义键盘