IPhoneアプリにUITextFieldがあります。テキストフィールドにすべてのテキストを選択させる方法を知っていますが、選択を変更するにはどうすればよいですか?最後の5文字、または特定の範囲の文字を選択したいとしますが、それは可能ですか?そうでない場合は、ユーザーがドラッグしているように、選択範囲の開始と終了を示す線を移動できますか?
UITextFieldではできません。ただし、ヘッダーが表示されている場合は、いくつかのカテゴリを追加した場合に使用される可能性のある_selectedRangeなどがあります;)
これで、UITextFieldとUITextViewはUITextInputプロトコルに準拠するため、次のことが可能になります:)
キャレットの前の最後の5文字を選択すると、次のようになります。
// Get current selected range , this example assumes is an insertion point or empty selection
UITextRange *selectedRange = [textField selectedTextRange];
// Calculate the new position, - for left and + for right
UITextPosition *newPosition = [textField positionFromPosition:selectedRange.start offset:-5];
// Construct a new range using the object that adopts the UITextInput, our textfield
UITextRange *newRange = [textField textRangeFromPosition:newPosition toPosition:selectedRange.start];
// Set new range
[textField setSelectedTextRange:newRange];
特定の範囲の文字を選択するには、iOS5以降で次のようにします。
int start = 2;
int end = 5;
UITextPosition *startPosition = [self positionFromPosition:self.beginningOfDocument offset:start];
UITextPosition *endPosition = [self positionFromPosition:self.beginningOfDocument offset:end];
UITextRange *selection = [self textRangeFromPosition:startPosition toPosition:endPosition];
self.selectedTextRange = selection;
UITextField
sおよびその他のUIKit要素にはUITextPosition
およびUITextRange
の独自のプライベートサブクラスがあるため、新しい値を直接作成することはできませんが、テキストフィールドを使用して作成できます。テキストの最初または最後への参照と整数オフセットから。
逆を実行して、現在の選択の開始点と終了点の整数表現を取得することもできます。
int start = [self offsetFromPosition:self.beginningOfDocument toPosition:self.selectedTextRange.start];
int end = [self offsetFromPosition:self.beginningOfDocument toPosition:self.selectedTextRange.end];
これは、NSRange
sを使用して選択を処理するメソッドを追加するカテゴリです。 https://Gist.github.com/44632
ファイル拡張子のないファイルの名前を選択するには、次を使用します。
-(void) tableViewCellDidBeginEditing:(UITableViewTextFieldCell*) cell
{
NSInteger fileNameLengthWithoutExt = [self.filename length] - [[self.filename pathExtension] length];
UITextField* textField = cell.textField;
UITextPosition* start = [textField beginningOfDocument];
UITextPosition* end = [textField positionFromPosition:start offset: fileNameLengthWithoutExt - 1]; // the -1 is for the dot separting file name and extension
UITextRange* range = [textField textRangeFromPosition:start toPosition:end];
[textField setSelectedTextRange:range];
}
これらは両方とも私のために働きます:
[UITextField selectAll:self];
そして:
UITextField.selectedRange = NSMakeRange(0, 5);
ただし、テキストフィールドがファーストレスポンダーである場合に限ります。 (つまり、キーボードが表示されている場合のみです。)したがって、いずれかのselectメソッドの前に次のようにする必要があります。
[UITextField becomeFirstResponder];
テキストを選択して表示する場合。
受け入れられた答えへのほんの少しの追加。 iOS 5では、UITextViewのテキストの長さが0(テキストがない)の場合、次の行でアプリがクラッシュします。
[self textRangeFromPosition:startPosition toPosition:endPosition];
小さな回避策は、次のようなlength == 0
チェックを追加することです。
if (textField.text && textField.text.length > 0) {
// Get current selected range , this example assumes is an insertion point or empty selection
UITextRange *selectedRange = [textField selectedTextRange];
// Calculate the new position, - for left and + for right
UITextPosition *newPosition = [textField positionFromPosition:selectedRange.start offset:-5];
// Construct a new range using the object that adopts the UITextInput, our textfield
UITextRange *newRange = [textField textRangeFromPosition:newPosition toPosition:selectedRange.start];
// Set new range
[textField setSelectedTextRange:newRange];
}
最後の5文字を選択します。
if let newPosition = textField.positionFromPosition(textField.endOfDocument, inDirection: UITextLayoutDirection.Left, offset: 5) {
textField.selectedTextRange = textField.textRangeFromPosition(newPosition, toPosition: textField.endOfDocument)
}
任意の範囲を選択します。
// Range: 3 to 7
let startPosition = textField.positionFromPosition(textField.beginningOfDocument, inDirection: UITextLayoutDirection.Right, offset: 3)
let endPosition = textField.positionFromPosition(textField.beginningOfDocument, inDirection: UITextLayoutDirection.Right, offset: 7)
if startPosition != nil && endPosition != nil {
textField.selectedTextRange = textField.textRangeFromPosition(startPosition!, toPosition: endPosition!)
}
私の完全な答えは ここ です。