簡體   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