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

时间:2014-07-08 08:56:18

标签: ios objective-c keyboard ios8

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

keyboard documentation

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

  • 用户通讯簿数据库中未配对的名字和姓氏
  • 设置>中定义的文字快捷方式一般>键盘>快捷方式列表
  • 常用字词词典

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

如何在requestSupplementaryLexiconWithCompletion中使用UILexicon?

9 个答案:

答案 0 :(得分:22)

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

  1. 使用requestSupplementaryLexiconWithCompletion()在启动时获取词典。
  2. 输入每种类型文字,将其添加到NSString(跟踪当前单词)
  3. 当用户按下空格(当前词的结尾)时,检查词典中的词典
  4. 如果是匹配计数字符数并删除该字符数
  5. 输入词典
  6. 建议的建议
  7. 清除字符串并重新开始
  8. 此外,您还可以使用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的个人体验

答案 1 :(得分:6)

关于自动更正,我可以使用http://www.apple.com/添加它。这是我在链接中使用的代码段:

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的完整文档link

答案 2 :(得分:4)

虽然我没有亲自尝试创建自定义键盘,但我的回答基于文档中的内容。

在键盘中,创建一个名为entries的{​​{1}}类型的属性(AnyObjects数组)。

[AnyObject]方法或创建键盘的任何位置,请调用此方法:

init

我怀疑requestSupplementaryLexiconWithCompletion(completionHandler: { lexicon in self.entries = lexicon.entries }) 实际上是一个字符串或NSStrings数组,但它可能是字典或其他类型。在对此进行测试时,请在确定逻辑之前尝试确定entries中实际包含的类型。

我不相信目前有办法获得Apple的默认自动更正选项。但是,这个WWDC talk提供了有关他们如何在原始iPhone OS(大约30分钟标记)内进行自动更正工作的见解。

他提到使用数组的二进制搜索,这让我相信这个数组是有序的。当然,自从第一款iPhone发布以来,可能会发生很多变化......

祝你好运这个新的API!

答案 3 :(得分:2)

这是您实际访问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);
    }
}];

答案 4 :(得分:1)

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

用户通讯簿数据库中未配对的名字和姓氏 设置>中定义的文字快捷方式一般>键盘>快捷键列表 包含Apple产品名称的常用词典

答案 5 :(得分:1)

如果有人还在研究这个问题,我发现了一个名为Presage的非常好的C ++预测文本库。它似乎在演示的基础上做得很好,但我在尝试将其集成为库时遇到了很多麻烦(请参阅我的问题here)。

让我知道是否有人有任何想法,非常有兴趣让这个工作!

答案 6 :(得分:1)

实际上,UILexicon只是一种获取拼写检查系统应该尝试修复的特定于用户的单词的方法。可能最常用的方法是填写UITextChecker被忽略的单词列表。

let lexicon: UILexicon = ...
let checker: UITextChecker = ...

for entry in lexicon.entries {
    if entry.documentText == entry.userInput {
        checker.ignoreWord(entry.documentText)
    }
}

此外,UILexicon可以用作自动放置的快捷方式的来源,例如(" omw" ="在我的路上!"),但它不是自动更正的术语拼写。

答案 7 :(得分:1)

您可以使用以下逻辑进行自动更正&它也适用于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];
}

答案 8 :(得分:0)

上面的结果很快得到答复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,因为这也引发了一个异常,我还没有弄清楚为什么。但这现在对我有效。