12

iPhone 5(iOS 8.0.2が搭載されている)用のXcode 6.0.1を使用してiOS 8アプリを作成しています。ユーザーが私の をクリックするとUITextView、すべてのテキストが選択されて、簡単に入力を開始してそこにあったものを消去できるようにしたい (ただし、ユーザーが保持したい場合があるため、テキストが自動的に消去されることは望ましくない)それまたはそれに追加します)。これを行うには、次のコードがあります。

- (void)textViewDidBeginEditing:(UITextView *)textView {
    if ([textView hasText]) {
        NSLog(@"selectedRange before: %d", textView.selectedRange.length);
        [textView selectAll:self];
        NSLog(@"selectedRange after: %d", textView.selectedRange.length);
    }
}

このメソッドが呼び出されると、コンソール出力は期待どおりになります (つまり、長さはのテキストのselectedRange文字数と同じです)。textViewただし、 で選択されているものは何も表示されず、選択されたUITextViewように動作しません (つまり、選択メニューがポップアップしません)。

インターネットでこのような質問を複数見ましたが、提供された解決策はどれもうまくいきませんでした(解決策を提供せずにバグとして書き留めたものもありました)。self送信者 ID を( などの)以外のものに変更してnilも効果はありませんでした[textView select:self]。私もこのコードを試しました:

- (void)textViewDidBeginEditing:(UITextView *)textView {
    if ([textView hasText]) {
        UITextRange *range = [textView textRangeFromPosition:textView.beginningOfDocument toPosition:textView.endOfDocument];
        [textView setSelectedTextRange:range];
    }
}

しかし、それには同じ問題があります。

助言がありますか?

4

3 に答える 3

33

このソリューションも機能し、サブクラス化は必要ありませんUITextView。デリゲートにこの関数を配置するだけです。

目的 C -

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView {
  dispatch_async(dispatch_get_main_queue(), ^{
    [textView selectAll:nil];
  });
  return YES;
}

スイフト 3 -

func textViewDidBeginEditing(_ textView: UITextView) {
    DispatchQueue.main.async {
        textView.selectAll(nil)
    }
}
于 2015-04-29T01:28:48.147 に答える
4

@brentvatne のソリューションは私にとってはうまくいきました。Swift の構文を投稿して、将来コピー アンド ペーストできるようにします。

func textViewShouldBeginEditing(textView: UITextView) -> Bool {
    dispatch_async(dispatch_get_main_queue()) {
        textView.selectAll(nil)
    }
    return true
}
于 2015-11-13T01:21:24.280 に答える
3

これまでのところ、この問題に対して私が見つけた最善の解決策は、カスタムを作成UITextView(つまり、 を拡張する新しいクラスを作成) してから、次のようにメソッドUITextViewを実装することです。selectAll

- (void)selectAll:(id)sender {
    [super selectAll:sender];
    UITextRange *selectionRange = [self textRangeFromPosition:self.beginningOfDocument toPosition:self.endOfDocument];
    [self performSelector:@selector(setSelectedTextRange:) withObject:selectionRange afterDelay:0.0];
}

次に、テキスト ビューを使用するときに、そのタイプをカスタム テキスト ビュー タイプに設定します (コード内およびストーリーボード内)。selectAllこれで、必要なときにいつでもメソッドを正常に呼び出すことができます。これもうまくいくはずUITextFieldですが、まだ試していません。

于 2014-11-28T18:31:29.500 に答える