[英]How to use autocorrection and shortcut list in iOS8 custom keyboard?
我想將自動更正和快捷方式列表(例如默認的英文鍵盤)與我的自定義鍵盤一起使用。 我檢查了鍵盤上的文檔,但不知道如何使用。
在鍵盤文檔中 。
每個自定義鍵盤(獨立於其RequestsOpenAccess鍵的值)都可以通過UILexicon類訪問基本的自動更正詞典。 利用該類以及您自己設計的詞典,在用戶輸入文本時提供建議和自動更正。 UILexicon對象包含來自各種來源的單詞,包括:
如何在Objective-C中從字典訪問快捷方式列表和輸入?
如何將UILexicon與requestSupplementaryLexiconWithCompletion一起使用?
實施詞典的方式看起來非常像這樣:
requestSupplementaryLexiconWithCompletion()
一次啟動即可獲取詞典。 NSString
(跟蹤當前單詞) 此外,您還可以使用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對象包含來自各種來源的單詞,包括:
用戶地址簿數據庫中不成對的名字和姓氏在“設置”>“常規”>“鍵盤”>“快捷方式”列表中定義的文本快捷方式包含蘋果產品名稱的常用單詞詞典
實際上, 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.