繁体   English   中英

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

[英]How to use autocorrection and shortcut list in iOS8 custom keyboard?

我想将自动更正和快捷方式列表(例如默认的英文键盘)与我的自定义键盘一起使用。 我检查了键盘上的文档,但不知道如何使用。

键盘文档中

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

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

如何在Objective-C中从字典访问快捷方式列表和输入?

如何将UILexicon与requestSupplementaryLexiconWithCompletion一起使用?

实施词典的方式看起来非常像这样:

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

此外,您还可以使用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对象包含来自各种来源的单词,包括:

用户地址簿数据库中不成对的名字和姓氏在“设置”>“常规”>“键盘”>“快捷方式”列表中定义的文本快捷方式包含苹果产品名称的常用单词词典

如果仍然有人在研究这个问题,我发现了一个非常不错的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” =“我在路上!”),但是就拼写而言,它不是自动更正。

您可以对自动更正使用以下逻辑,它也可以在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM