web-dev-qa-db-ja.com

UITextFieldのすべてのテキストをプログラムで選択する

UITextFieldのすべてのテキストをプログラムで選択するにはどうすればよいですか?

69
Mirko

-selectAll:を呼び出すと、nil以外の送信者でメニューが表示されます。 nilで呼び出すと、テキストは選択されますが、メニューは表示されません。

これについてのバグレポートがAppleから戻ってきたので、selfではなくnilを渡すという提案とともにこれを試しました。

UIMenuControllerやその他の選択APIをいじる必要はありません。

52
Rick

それは私のためにトリックをしたものです:

[self.titleField setSelectedTextRange:[self.titleField textRangeFromPosition:self.titleField.beginningOfDocument toPosition:self.titleField.endOfDocument]];

かなりいですが、動作するため、sharedMenuControllerは表示されません!

「毎回のみ機能する」問題を修正するには、次を使用します。

    __weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
    __strong __typeof(weakSelf) strongSelf = weakSelf;
    UITextRange *range = [strongSelf textRangeFromPosition:strongSelf.beginningOfDocument toPosition:strongSelf.endOfDocument];
    [strongSelf setSelectedTextRange:range];
});

エリック・ベイカーに感謝します(ここのコメントから編集したばかりです)

81

上記のMirkoのコメントを検証するためにこれをテストしましたが、私のテストではselectAll:は、実際にUITextField自体に送信されるときにすべてのテキストを選択します。

テキストはすぐにCUT |で隠されることに注意してください。コピー|過去のアクションですが、あなたの質問には、ユーザーが「すべて選択」をタップして最初に表示するものです。

解決策は次のとおりです。2行目では、明示的なユーザー選択を無効にすることなく、CUT/COPY/PASTEダイアログを一時的に非表示にします。

[_myTextField selectAll:self];
[UIMenuController sharedMenuController].menuVisible = NO;
48
Justin Searls

必要なものを使用する

ObjC

 [yourtextField becomeFirstResponder]; //puts cursor on text field

 [yourtextField selectAll:nil];  //highlights text

 [yourtextField selectAll:self]; //highlights text and shows menu(cut copy paste)

スイフト

yourTextField.becomeFirstResponder() //puts cursor on text field

yourTextField.selectAll(nil)  //highlights text

yourTextField.selectAll(self) //highlights text and shows menu(cut copy paste)
38
Ted

Swift

UITextField内のすべてのテキストを選択します。

textField.selectedTextRange = textField.textRangeFromPosition(textField.beginningOfDocument, toPosition: textField.endOfDocument)

私の完全な答えは こちら です。

8
Suragch

これは私が見つけた最良の解決策です。 sharedMenuControllerはありません。連続して動作します。

    -(void)textFieldDidBeginEditing:(UITextField *)textField
{
    [textField performSelector:@selector(selectAll:) withObject:nil afterDelay:0.1];
}
7
Jase68

テキストを選択できるようにするには、テキストフィールドを編集可能にする必要があります。テキストフィールドが編集可能になるタイミングを知るには、デリゲートメソッドを使用します。

- (void)textFieldDidBeginEditing:(UITextField *)textField
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

TextFieldShouldBeginEditing:は必須ではないと思いますが、これは実装で使用したものです。

- (void)textFieldDidBeginEditing:(UITextField *)textField{
    [textField selectAll:textField];
}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
    return YES;
}

SelectAllにnilを渡すと、メニューは表示されません。

3
Jason Daniels

残念ながら、それができるとは思いません。

これが役立つかどうかはわかりませんが、setClearsOnBeginEditingを使用すると、ユーザーが編集を開始したときにUITextFieldが既存の値を削除するように指定できます(これはセキュアUITextFieldsのデフォルトです)。

2
Dan J

スウィフト3:

textField.selectAll(self)
2
John Scalo

内部にUITextFieldを含むカスタムアラートビューを作成します。テキストフィールドに問題があることがわかりました:beginningOfDocumentは、テキストフィールドが画面に追加され、becomeFirstResponderが呼び出された場合にのみ値を持ちます。

それ以外の場合、beginningOfDocumentnilを返し、[UITextField textRangeFromPosition:]は値を取得できません。

このケースを解決するためのサンプルコードを次に示します。

UIWindow *window = [[[UIApplication sharedApplication] windows] firstObject];
[window addSubview:theAlertView]; // textfield must be added as a subview of screen first
UITextField *textField = theAlertView.textField;
[textField becomeFirstResponder]; // then call to show keyboard and cursor 
UITextRange *range = [textField textRangeFromPosition:textField.beginningOfDocument toPosition:textField.endOfDocument]; // at this time, we could get beginningOfDocument
[textField setSelectedTextRange:range]; // Finally, it works!!!
1
nahung89
UITextField *tf = yourTF;
// hide cursor (you have store default color!!!)
[[tf valueForKey:@"textInputTraits"] setValue:[UIColor clearColor]
                                       forKey:@"insertionPointColor"];
// enable selection
[tf selectAll:self];
// insert your string here
// and select nothing (!!!)
[tf setMarkedText:@"Egor"
    selectedRange:NSMakeRange(0, 0)];

できた!

0
Sound Blaster