25

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

4

7 に答える 7

32

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];
于 2010-07-19T04:31:14.583 に答える
13

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

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

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

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

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

于 2013-01-05T19:00:06.800 に答える
5

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

-(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];
}
于 2013-12-11T15:12:34.977 に答える
3

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

[UITextField selectAll:self];

と:

UITextField.selectedRange = NSMakeRange(0, 5);

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

[UITextField becomeFirstResponder];

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

于 2011-04-27T05:37:04.033 に答える
1

受け入れられた答えへのほんの少しの追加。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];
}
于 2013-08-31T14:02:06.947 に答える
0

迅速

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

私の完全な答えはここにあります。

于 2016-01-21T12:02:07.293 に答える
0

Swift 5.0

これが私がファイル名を選択する方法PandaですPanda.txt

func textFieldDidBeginEditing(_ textField: UITextField) {
    // if textField.text is `Panda.txt`, offset will be 3
    let offset = String(textField.text!.split(separator: ".").last!).length
    let from = textField.position(from: textField.beginningOfDocument, offset: 0)
    let to = textField.position(from: textField.beginningOfDocument,
                                offset:textField.text!.length - (offset+1) )
    //now `Panda` will be selected
    textField.selectedTextRange = textField.textRange(from: from!, to: to!)
}

于 2019-09-19T08:20:09.863 に答える