2012-08-31 43 views
0

我正在用insertText:自己做一些自定義自動完成的東西,但是如果有自動更正的建議可見,則視圖會進入奇怪的狀態。如何以編程方式關閉UITextView中的自動更正彈出窗口?

如果我使用[textView unmarkText],它將關閉自動更正的彈出式菜單 - 但它接受自動更正(這是不好的)。有沒有辦法以編程方式拒絕自動更正建議?

我目前的「解決方案」有效,但它很笨重,我沒有理由認爲它會在未來繼續工作。有一個更好的方法嗎?

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

是否有原因,您不能將'textView.autocorrectionType'設置爲'UITextAutocorrectionTypeNo'。 –

+0

是的。該字段應該具有自動更正。 –

回答

6

我想你類似的東西,但設置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]; 
     } 
    } 
} 
2

工作你原來的解決方案是密切。請嘗試以下操作:

- (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。接受自動更正後,您將文本和選定範圍重置爲自動更正之前的內容。

+0

這太棒了!謝謝。完美解決問題 –

0

如果辭職從文本視圖第一響應者是不需要的,你可以將作爲代表到文本視圖,你可以實現方法

- (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方法中有某些邏輯時,例如,在您解除自動更正時不希望執行的方法。

2

我剛剛遇到了這個問題。這種解決方案效果很好:

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