13

私の問題は、UITextView の selectedRange をプログラムで設定すると、テキストが選択されますが、選択されていることを視覚的に示さないことです。これは OS 3.0/3.1 のバグのように聞こえますか? さらに重要なことに、選択を表示するための解決策や提案はありますか? (サンプル プロジェクトはメッセージの下部にリンクされています)

視覚的なフィードバックが得られないので、それが選択されていることをどうやって知ることができますか? 2 つの理由:

  1. 点滅カーソルなし
  2. キーボードの任意のキーをタップすると、選択範囲内の既存のテキストが削除されます。

ユーザーが変更可能な値を編集できるビューコントローラーに UITextView があります。エディター コントローラーは、テーブルの行でダブルタップを受け取るか、ユーザーが行の詳細開示ボタンをタップすると開きます。viewcontroller は presentModalViewController 経由で到着し、エディター VC の viewWillAppear メソッドで、次のコマンドでキーボードを開始します。[self.textView becomeFirstResponder];

ユーザーが入力を開始するだけで既存のコンテンツを削除できるように、テキストビューのコンテンツ全体を選択してエディターを起動したい場合があります (これは、デフォルトのタイトルで新しいアイテムを作成するため、ユーザーが最初に削除することはほぼ確実です)エディターのテキスト フィールドの内容全体を入力してから、タイトルを入力します)。

私がすでに試したことのいくつか:

  1. 選択した範囲をviewDidAppearに設定します(textViewDidBeginEditingで行う代わりに、それに加えて)。
  2. _textView.text をその中のテキストのコピーに置き換えてから、(textViewDidBeginEditing で) selectedRange を適用します...フレームワークのバグを扱っている場合、これは回避される可能性があります。
  3. [[_textView webView] selectAll];(プライベート API)。同じ動作で、視覚的なフィードバックなしでテキストが選択されます。
  4. _textView setNeedsDisplay および setNeedsLayout を送信します。
  5. performSelector ... afterDelay を使用して selectedRange を設定し、textViewDidBeginEditing を終了した後に発生するようにします。

SOの参照: ここここ

// 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 つのことがわかりました。

  • テキストが選択されているがハイライトが表示されていない場合、いくつかのキーストロークをタップしてから「シェイクして元に戻す」と、元のテキストが復元されますがハイライトされます。

  • テキストビューで手動で選択し、[すべて選択] ボタンをタップすると [上記のサンプル プロジェクトを参照]、すべてのテキストが選択され、ハイライトが適切に表示されます。

4

4 に答える 4

17

textViewでプログラムで選択を設定する前に、selectを呼び出して、新しい選択を視覚的に表示します。例えば:

[textView select:self];
textView.selectedRange = newSelectedRange; 
于 2010-07-12T10:17:13.393 に答える
4

私は今のところ自分の質問に答え、後でさらに情報があれば更新します(または、他の誰かが適切な回避策を見つけた場合は、チェックをその答えに移動します)。私はアップルにバグレポートを持っていて、サンプルコードを提出した後、それは開いた状態でそこに座っています。バグだと確信しているので、返事が来たらここでお伝えします。

于 2009-11-15T17:49:23.263 に答える
1

突然この質問に遭遇します。NSObject の宣言ヘッダーを確認するまで、同じ問題がありました。彼らはすでにselectAllという名前の関数を提供しています:

@interface NSObject(UIResponderStandardEditActions)   // these methods are not implemented in NSObject

- (void)cut:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)copy:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)paste:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)select:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)selectAll:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)delete:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_2);

@end
于 2010-09-02T16:51:53.617 に答える
0

回避策: UITextView プレースホルダー機能が必要なようです。これはもちろん存在しません。ただし、ここにはいくつかの回避策があります

于 2009-11-10T18:11:18.350 に答える