5

キーボードで削除キーを押したままにすると、iOS が UITextViewDelegate に誤った情報を提供するという問題が発生しました。

ユーザーが iPad のUITextViewで削除キーを押し続けると、UITextView は押し続けている時間が長いほど、個々の文字ではなく単語全体を削除し始めます (注: これはシミュレーターでは発生しません)。

これが発生すると、UITextView デリゲート メソッドは次のようになります。

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

正しいカーソル位置で構成される範囲で呼び出されますが、長さは 1 です。これは、UITextView が単一の文字ではなく単語全体を削除するようになったため、正しくありません。たとえば、次のコードは単一のスペースのみを出力します。

[textView substringWithRange:range]
string contains " "

UITextView が単語全体を削除しているにもかかわらず。置換テキストは、空の文字列として正しく指定されます。この問題の解決策または回避策を知っている人はいますか?

4

1 に答える 1

5

ジェイコブは、これを回答として投稿する必要があると述べました。だからここにあります。

これに対する私のハックな回避策は、shouldChangeTextInRange で指定されたテキストの長さと範囲を監視し、それを textViewDidChange のテキストの長さと比較することです。差分が同期していない場合は、バッキング テキスト バッファーをフラッシュし、テキスト ビューから再構築します。これは最適ではありません。ここに私の一時的な回避策があります:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    //Push the proposed edit to the underlying buffer
    [self.editor.buffer changeTextInRange:range replacementText:text];

    //lastTextLength is an NSUInteger recording the length that
    //this proposed edit SHOULD make the text view have
    lastTextLength = [textView.text length] + ([text length] - range.length);

    return YES;
}

- (void)textViewDidChange:(UITextView *)textView
{
    //Check if the lastTextLength and actual text length went out of sync
    if( lastTextLength != [textView.text length] )
    {
        //Flush your internal buffer
        [self.editor.buffer loadText:textView.text];
    } 
}
于 2012-02-07T00:43:40.583 に答える