0

を使用して自分でカスタムのオートコンプリートを行っていますが、オートinsertText:コレクトの提案が表示されている場合、ビューは奇妙な状態になります。

を使用する[textView unmarkText]と、自動修正ポップアップが閉じられますが、自動修正は受け入れられます (これは悪いことです)。オートコレクトの提案をプログラムで拒否する方法はありますか?

私の現在の「解決策」は機能しますが、それはひどくハッキーであり、将来も機能し続けると想定する理由はありません. これを行うより良い方法はありますか?

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

4 に答える 4

6

私はあなたと同じようなことを試みましたが、textViewのテキストをこのように設定すると、textViewが不必要にスクロールします(私のtextViewにはかなりのテキストが含まれています)。私の解決策は、アニメーション化されていない方法でcontentOffsetを復元することです。それはあなたが持っているものよりも正確にエレガントではありませんが、少なくともそれはより長いテキストを扱う必要がある人々を助けます。

今後も動作するかどうかは、iOS 4からこのようなものを試しましたが、iOS6でも動作し続けます。

- (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];
        }
    }
}
于 2012-10-22T13:10:09.777 に答える
2

元のソリューションは近いです。次のことを試してください。

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

reject/become first Responder を続けて呼び出すと、テキスト ビューは保留中の自動修正をすぐに受け入れますが、実際にはキーボードを閉じることはありません (試してみると驚くでしょう)。これは確かに iOS 6 と iOS 7 で動作します。自動修正を受け入れた後、テキストと選択範囲を自動修正前の状態にリセットします。

于 2013-08-31T22:44:14.177 に答える
1

テキスト ビューからファーストレスポンダを辞任することが望ましくなく、デリゲートとしてテキスト ビューにアタッチできる場合は、メソッドを実装できます。

- (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

于 2014-03-30T14:23:46.927 に答える