UITextFieldのすべてのテキストをプログラムで選択するにはどうすればよいですか?
-selectAll:を呼び出すと、nil以外の送信者でメニューが表示されます。 nilで呼び出すと、テキストは選択されますが、メニューは表示されません。
これについてのバグレポートがAppleから戻ってきたので、selfではなくnilを渡すという提案とともにこれを試しました。
UIMenuControllerやその他の選択APIをいじる必要はありません。
それは私のためにトリックをしたものです:
[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];
});
エリック・ベイカーに感謝します(ここのコメントから編集したばかりです)
上記のMirkoのコメントを検証するためにこれをテストしましたが、私のテストではselectAll:
は、実際にUITextField自体に送信されるときにすべてのテキストを選択します。
テキストはすぐにCUT |で隠されることに注意してください。コピー|過去のアクションですが、あなたの質問には、ユーザーが「すべて選択」をタップして最初に表示するものです。
解決策は次のとおりです。2行目では、明示的なユーザー選択を無効にすることなく、CUT/COPY/PASTEダイアログを一時的に非表示にします。
[_myTextField selectAll:self];
[UIMenuController sharedMenuController].menuVisible = NO;
必要なものを使用する
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)
Swift
UITextField
内のすべてのテキストを選択します。
textField.selectedTextRange = textField.textRangeFromPosition(textField.beginningOfDocument, toPosition: textField.endOfDocument)
私の完全な答えは こちら です。
これは私が見つけた最良の解決策です。 sharedMenuControllerはありません。連続して動作します。
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
[textField performSelector:@selector(selectAll:) withObject:nil afterDelay:0.1];
}
テキストを選択できるようにするには、テキストフィールドを編集可能にする必要があります。テキストフィールドが編集可能になるタイミングを知るには、デリゲートメソッドを使用します。
- (void)textFieldDidBeginEditing:(UITextField *)textField
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
TextFieldShouldBeginEditing:は必須ではないと思いますが、これは実装で使用したものです。
- (void)textFieldDidBeginEditing:(UITextField *)textField{
[textField selectAll:textField];
}
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
return YES;
}
SelectAllにnilを渡すと、メニューは表示されません。
残念ながら、それができるとは思いません。
これが役立つかどうかはわかりませんが、setClearsOnBeginEditing
を使用すると、ユーザーが編集を開始したときにUITextField
が既存の値を削除するように指定できます(これはセキュアUITextFields
のデフォルトです)。
スウィフト3:
textField.selectAll(self)
内部にUITextField
を含むカスタムアラートビューを作成します。テキストフィールドに問題があることがわかりました:beginningOfDocument
は、テキストフィールドが画面に追加され、becomeFirstResponder
が呼び出された場合にのみ値を持ちます。
それ以外の場合、beginningOfDocument
はnil
を返し、[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!!!
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)];
できた!