2012-02-15 13 views
3

私はUITextViewを持っており、すべてのテキストビューの変更イベントを配列に記録しています。UITextViewデリゲートメソッドtextView:shouldChangeTextInRange:replacementText:高速削除時に誤ったreplacementTextを返します

textView:shouldChangeTextInRange:replacementTextメソッドが呼び出されたときにユーザーが高速削除(削除キーを押したまま1単語だけで削除されるようにする)の場合、範囲変数の長さは1実際には、範囲は単語内で削除された文字の数でなければなりません。誰でもこのApple Bugの回避策を知っていますので、UITextViewで変更された場所と範囲とテキストを正しく識別できますか?

答えて

0

いいえ、それはバグではありません。この関数は、テキストが変化するたびに呼び出されます。おそらくあなたはデバッグモードで作業していて、キーボードでバックスペースを与えているでしょう。ブレークポイントに達する前に複数のイベントが生成されます。したがって、関数は複数回呼び出しを取得します。

+0

私は、画面上のデバイスのキーボードでバックスペースキーを押していますが。この関数は、テキストビューが変更されるたびに呼び出され、正しいものとなります。しかし、ユーザーが速く削除していて、単語全体が削除されると、一度呼び出されますが、range.lengthは1だけです。速い削除で単語全体を削除すると、shouldChangeTextInRangeメソッドは一度に削除された単語全体で削除された文字ごとに複数回呼び出されますか? – cncool

0

質問で言及したように、単語全体が削除されても、「範囲」は常に1です。 UITextViewから削除される正確な文字数を提供する範囲 'range.length'の長さをチェックする必要があります。 は、私は、同じシナリオを持っていたし、一度だけではない単語全体で単一の文字を削除することができます周りにそれに基づいていくつかの仕事でした:

-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { 
    if([text isEqualToString:@""]) { 
     // Check if length of range being deleted is less than 1 then only delete it 
     if (range.length > 1) { 
      return NO; 
     } else 
      return YES; 
    } else { 
     return YES; 
    } 
} 
関連する問題