私の問題は、UITextView の selectedRange をプログラムで設定すると、テキストが選択されますが、選択されていることを視覚的に示さないことです。これは OS 3.0/3.1 のバグのように聞こえますか? さらに重要なことに、選択を表示するための解決策や提案はありますか? (サンプル プロジェクトはメッセージの下部にリンクされています)
視覚的なフィードバックが得られないので、それが選択されていることをどうやって知ることができますか? 2 つの理由:
- 点滅カーソルなし
- キーボードの任意のキーをタップすると、選択範囲内の既存のテキストが削除されます。
ユーザーが変更可能な値を編集できるビューコントローラーに UITextView があります。エディター コントローラーは、テーブルの行でダブルタップを受け取るか、ユーザーが行の詳細開示ボタンをタップすると開きます。viewcontroller は presentModalViewController 経由で到着し、エディター VC の viewWillAppear メソッドで、次のコマンドでキーボードを開始します。[self.textView becomeFirstResponder];
ユーザーが入力を開始するだけで既存のコンテンツを削除できるように、テキストビューのコンテンツ全体を選択してエディターを起動したい場合があります (これは、デフォルトのタイトルで新しいアイテムを作成するため、ユーザーが最初に削除することはほぼ確実です)エディターのテキスト フィールドの内容全体を入力してから、タイトルを入力します)。
私がすでに試したことのいくつか:
- 選択した範囲をviewDidAppearに設定します(textViewDidBeginEditingで行う代わりに、それに加えて)。
- _textView.text をその中のテキストのコピーに置き換えてから、(textViewDidBeginEditing で) selectedRange を適用します...フレームワークのバグを扱っている場合、これは回避される可能性があります。
[[_textView webView] selectAll];
(プライベート API)。同じ動作で、視覚的なフィードバックなしでテキストが選択されます。- _textView setNeedsDisplay および setNeedsLayout を送信します。
- performSelector ... afterDelay を使用して selectedRange を設定し、textViewDidBeginEditing を終了した後に発生するようにします。
// UITextFieldDelegate Methods...
- (void)textViewDidBeginEditing:(UITextView *)_textView
{
NSInteger len = [_textView.text length];
if( self.selectInitialText ){
//NOTE: this is not working as expected. Indeed the text is
// selected but the highlighting of the text isn't showing.
_textView.selectedRange = NSMakeRange(0,len);
}
}
-- 編集 --
これは、Apple BugReporter に提出されたサンプル プロジェクトです。BugReport_7380723 サンプル プロジェクトのダウンロード
追加情報:
サンプル プロジェクトの提出物を作成して遊んでいるうちに、次の 2 つのことがわかりました。
テキストが選択されているがハイライトが表示されていない場合、いくつかのキーストロークをタップしてから「シェイクして元に戻す」と、元のテキストが復元されますが、ハイライトされます。
テキストビューで手動で選択し、[すべて選択] ボタンをタップすると [上記のサンプル プロジェクトを参照]、すべてのテキストが選択され、ハイライトが適切に表示されます。