簡體   English   中英

如何以編程方式消除UITextView中的自動更正彈出框?

[英]How can I programmatically dismiss the autocorrect popover in a UITextView?

我正在用insertText:自己做一些自定義自動完成的東西,但是如果有自動insertText:的建議可見,則視圖將進入怪異狀態。

如果我使用[textView unmarkText] ,它將自動[textView unmarkText]彈出的東西-但它接受自動[textView unmarkText] (這很不好)。 有什么方法可以以編程方式拒絕自動更正建議嗎?

我當前的“解決方案”有效,但是它很粗糙而且很笨拙,我沒有理由認為它將來會繼續有效。 有一個更好的方法嗎?

- (void)dismissAutocorrectSuggestionForTextView:(UITextView *)textView {
    NSRange range = textView.selectedRange;
    textView.text = textView.text;
    textView.selectedRange = range;
}

我嘗試過類似的操作,但是以這種方式設置textView的文本會導致textView不必要地滾動(我的textView包含很多文本)。 我的解決方案涉及以非動畫方式還原contentOffset。 它並沒有比您擁有的要優雅得多,但是至少它可以幫助需要處理較長文本的人。

至於它是否將來會繼續工作,自iOS 4起,我就嘗試過類似的方法,並且它在iOS 6中仍然可以工作。

- (void)rejectAutoCorrectSuggestionInTextView:(UITextView *)textView
{
    if ([textView isFirstResponder])
    {
        NSString *original = textView.text;
        NSRange originalRange = textView.selectedRange;
        CGPoint originalOffset = textView.contentOffset;

        // Force any pending autocorrection to be applied
        [textView resignFirstResponder];
        [textView becomeFirstResponder];

        NSString *final = textView.text;

        if (![original isEqualToString:final])
        {
            textView.text = original;
            textView.selectedRange = originalRange;
            [textView setContentOffset:originalOffset animated:NO];
        }
    }
}

我本人只是遇到了這個問題。 此解決方案效果很好:

[textView.inputDelegate textWillChange:textView];
[textView.inputDelegate textDidChange:textView];

您原來的解決方案已經接近。 請嘗試以下操作:

- (void)dismissAutocorrectSuggestionForTextView:(UITextView *)textView {
    NSRange rangeCopy = textView.selectedRange;
    NSString *textCopy = textView.text.copy;
    [textView resignFirstResponder];
    [textView becomeFirstResponder];
    [textView setText:textCopy];
    [textView setSelectedRange:rangeCopy];
}

背對背調用辭職/成為第一響應者會使文本視圖立即接受待處理的自動更正,但實際上並沒有關閉鍵盤(嘗試這樣做會令您感到驚訝)。 當然,這適用於iOS 6和iOS 7。 接受自動更正后,然后將文本和所選范圍重置為自動更正之前的內容。

如果不需要從文本視圖中退出第一響應者,並且可以將其作為委托附加到文本視圖,則可以實現方法

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

並在特定情況下return NO 例如,您可以嘗試以下操作:

@implementation
{
    BOOL _denyReplacements;
}

//////////////

- (void)dismissAutocorrectSuggestionForTextView:(UITextView *)textView {
    NSRange rangeCopy = textView.selectedRange;
    NSRange fakeRange = rangeCopy;
    fakeRange.location--;
    _denyReplacements = YES;
    [textView unmarkText];
    [textView setSelectedRange:fakeRange];
    [textView setSelectedRange:rangeCopy];
    _denyReplacements = NO;
}

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
     return !_denyReplacements;
}

當文本視圖選擇更改時,自動完成功能會嘗試接受當前建議,但是文本視圖在進行替換之前會參考此方法。 例如,當您在textViewDidBeginEditing和/或textViewDidEndEditing方法中有一些邏輯時,為什么不執行此操作而不僅僅是辭職/成為第一響應者,例如,您不想在取消自動更正時執行這些邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM