UITextChecker completionsForPartialWordRange

时间:2016-01-08 15:16:14

标签: ios custom-keyboard uitextchecker

我正在构建自定义键盘扩展程序,并希望像Apple一样实现自动完成功能。 正如我所见,方法completionsForPartialWordRange返回按字母顺序排序的单词列表。如何按使用情况对结果进行排序?

enter image description here

2 个答案:

答案 0 :(得分:2)

completionsForPartialWordRange:inString:language:的文档说:

  

数组中的字符串按照它们应呈现给用户的顺序 - 也就是说,更可能的完成首先出现在数组中。

然而,结果非常清楚地按字母顺序排序,并且"更可能的完成在数组中排在第一位并不正确。"以下是使用iOS 9测试的:

NSString *partialWord = @"th";
UITextChecker *textChecker = [[UITextChecker alloc] init];
NSArray *completions = [textChecker completionsForPartialWordRange:NSMakeRange(0, partialWord.length) inString:partialWord language:@"en"];

"th"的iOS字词完成次数:

thalami,
thalamic,
thalamus,
thalassic,
thalidomide,
thallium,
...
the,
...

因此,在获得单词完成后,结果将需要再次排序。

此方法的OS X NSSpellChecker版本没有相同的问题:

NSString *partialWord = @"th";

NSArray *completions = [[NSSpellChecker sharedSpellChecker] completionsForPartialWordRange:NSMakeRange(0, partialWord.length) inString:partialWord language:@"en" inSpellDocumentWithTag:0];
  

拼写检查词典中的完整单词列表,按照它们应呈现给用户的顺序。

"th"的Mac OS X字词补全:

the,
this,
that,
they,
thanks,
there,
that's,
...

提交雷达错误报告将是一个好主意,因此希望在更高版本的iOS中修复该行为。如果您想复制,我已将此报告为rdar:// 24226582。

答案 1 :(得分:0)

Swift 4.0

 func autoSuggest(_ word: String) -> [String]? {
    let textChecker = UITextChecker()
    let availableLangueages = UITextChecker.availableLanguages
    let preferredLanguage = (availableLangueages.count > 0 ? availableLangueages[0] : "en-US");

    let completions = textChecker.completions(forPartialWordRange: NSRange(0..<word.utf8.count), in: word, language: preferredLanguage)

    return completions
   }