web-dev-qa-db-ja.com

UITextFieldで特定のテキストブロックを選択できますか?

IPhoneアプリにUITextFieldがあります。テキストフィールドにすべてのテキストを選択させる方法を知っていますが、選択を変更するにはどうすればよいですか?最後の5文字、または特定の範囲の文字を選択したいとしますが、それは可能ですか?そうでない場合は、ユーザーがドラッグしているように、選択範囲の開始と終了を示す線を移動できますか?

24
Sunian314

UITextFieldではできません。ただし、ヘッダーが表示されている場合は、いくつかのカテゴリを追加した場合に使用される可能性のある_selectedRangeなどがあります;)


IOS5以降のアップデート:

これで、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];
31
nacho4d

特定の範囲の文字を選択するには、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;

UITextFieldsおよびその他のUIKit要素にはUITextPositionおよびUITextRangeの独自のプライベートサブクラスがあるため、新しい値を直接作成することはできませんが、テキストフィールドを使用して作成できます。テキストの最初または最後への参照と整数オフセットから。

逆を実行して、現在の選択の開始点と終了点の整数表現を取得することもできます。

int start = [self offsetFromPosition:self.beginningOfDocument toPosition:self.selectedTextRange.start];
int end = [self offsetFromPosition:self.beginningOfDocument toPosition:self.selectedTextRange.end];

これは、NSRangesを使用して選択を処理するメソッドを追加するカテゴリです。 https://Gist.github.com/44632

13
Anthony Mattox

ファイル拡張子のないファイルの名前を選択するには、次を使用します。

-(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];
}
5
orkoden

これらは両方とも私のために働きます:

[UITextField selectAll:self];

そして:

UITextField.selectedRange = NSMakeRange(0, 5);

ただし、テキストフィールドがファーストレスポンダーである場合に限ります。 (つまり、キーボードが表示されている場合のみです。)したがって、いずれかのselectメソッドの前に次のようにする必要があります。

[UITextField becomeFirstResponder];

テキストを選択して表示する場合。

3
cetcet

受け入れられた答えへのほんの少しの追加。 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];
}
1

Swift

最後の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!)
}

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

0
Suragch