selectedRange
私は同じ問題に直面していました-基本的に、最初の応答者になると遅延が発生し、どの方法でも変更できなくなりますtextView*BeginEditing:
。setSelectedRange:
(としましょう)を遅らせようとすると、performSelector:withObject:afterDelay:
醜いジャークが表示されます。
解決策は実際には非常に単純です。デリゲート メソッドの順序を確認すると、ヒントが得られます。
textViewShouldBeginEditing:
textViewDidBeginEditing:
textViewDidChangeSelection:
最後のメソッド (3) で設定するとうまくいきます。コンテンツを更新するたびにメソッド (3) が呼び出されるため、最初のレスポンダーselectedRange
になるときにのみカーソルの位置を変更する必要があります。UITextView
shouldChangeTextInRange:
メソッド (1)、(2) のいずれかで設定された BOOL 変数と、(3) で変数をチェックすることでうまくいくはずです。常にカーソルがリセットされるのを避けるために、再配置後に変数をリセットすることを忘れないでください。 )。
それが役に立てば幸い!
編集
数回のテストの後shouldChangeTextInRange:
、(2) または (3) の代わりに BOOL フラグを設定することにしました。私のコードを見てください:
@interface MyClass
{
/** A flag to determine whether caret should be positioned (YES - don't position caret; NO - move caret to beginning). */
BOOL _isContentGenerated;
}
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
// deleting
if([text length] == 0)
{
// deleting last character
if(range.length == [[textView text] length])
{
// reached beginning
/**
code to show placeholder and reset caret to the beginning
*/
_isContentGenerated = NO;
}
}
else
{
// adding
if(range.location == 0)
{
/**
code to hide placeholder
*/
_isContentGenerated = YES;
}
}
return YES;
}
- (void)textViewDidChangeSelection:(UITextView *)textView
{
if(!_isContentGenerated)
{
[textView setSelectedRange:NSMakeRange(0, 0)];
}
}