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

要选择特定范围的字符,您可以在 iOS 5+ 中执行类似的操作

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/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);

但前提是文本字段是第一响应者。(换句话说,仅当键盘显示时。)因此,您需要在任一选择方法之前使用:

[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.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 回答
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 回答