テキストビューを元の状態に戻すために、UITextView のある種の更新を行いたいと思います。ユーザーがクリックした TableViewCell に応じて動的に入力される段落があります。そのため、テキスト フィールドをスクロールし、戻って別のセルを選択して戻ると、テキストは変更されますが、スクロール位置はユーザーが残したままになります。デフォルトの状態に戻すにはどうすればよいですか。ありがとう!
7 に答える
デフォルトの状態で、一番上までスクロールしたということですか?もしそうなら、あなたは正しい軌道に乗っています。試す
[myTextView scrollRangeToVisible:NSMakeRange(0, 0)];
最初に UITextView をクリアしてから新しいテキストを適用すると、自動的に一番上に「スクロール」して戻ることがわかりました。
myTextView.text = @"";
myTextView.text = theRealTextContent;
[textview setScrollEnabled:YES];
textview.text = yourText;
[textview setScrollEnabled:NO];
私はなんとか望ましい結果を得ることができました-編集が終了したときにUITextViewをコンテンツの一番上まで「スクロール」させました。しかし、それを実現するには、textViewDidEndEditingでスクロールを無効にすることと、同じメソッドでテキストをリセットすることの両方を行う必要がありました。
textViewDidBeginEditingでスクロールを再度有効にします。
- (void) textViewDidEndEditing: textView;
{
[textView setScrollEnabled: NO];
NSString* savedText = [textView text];
[textView setText:@""];
[textView setText: savedText];
}
これらのアプローチのいずれも、私にとって満足のいくものではありませんでした。
scrollRangeToVisible は、大量の視覚的アーティファクト (大きな文字列を切り替えるときに大量のスクロール) を生成し、実際には、内容が変更された後、遅延呼び出し (0.1 秒を使用) でのみ機能し、Shaggy Frog の回答が示唆するように直接ではありません。 .
新しいコンテンツを設定する前にテキストを @"" に設定しても、遅延があっても役に立ちませんでした。
UITextView が入力されると、新しいコンテンツを設定すると迷惑なスクロール アーティファクトが発生するこのモードが永遠に続くようです。selectionRange を UITextView の先頭にも設定しようとしましたが、それは役に立ちませんでした。新しいコンテンツを設定する前に、resignFirstResponder メッセージを送信しても役に立ちませんでした。
このため、コンテンツを変更するたびに UITextView を削除して再作成することにしました。これは、私のアプリでは (人間のやり取りに基づいて) まれなイベントであり、パフォーマンスの問題ではありません。これは、大量の迷惑なスクロール アーティファクトなしで UITextView に「新しいコンテンツを読み込む」ことができる唯一の方法でした。
私の経験はOS3.2(iPadシミュレーター)です
テキストコンテンツをクリアしてから、次の実行ループで目的のテキストを設定する方法が最終的にうまくいきました。
// clear the text view
self.textView.text = ""
// set the text on the next run loop
dispatch_async(dispatch_get_main_queue()) {
self.textView.text = someText
}