我可以在UITextField中选择特定的文本块吗?

时间:2010-07-18 22:35:56

标签: iphone iphone-sdk-3.0 uitextfield textselection

我的iPhone应用程序中有一个UITextField。我知道如何使文本字段选择其所有文本,但如何更改选择?假设我想选择最后5个字符,或者特定范围的字符,那可能吗?如果没有,我可以移动标记选择开始和结束的线条,就好像用户正在拖动它们一样吗?

7 个答案:

答案 0 :(得分:29)

使用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];

答案 1 :(得分: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;

由于UITextField和其他UIKit元素都有自己的UITextPositionUITextRange私有子类,因此无法直接创建新值,但您可以使用文本字段为其创建你从文本的开头或结尾的引用和整数偏移。

您也可以反过来获取当前选择的起点和终点的整数表示:

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

这是一个类别,它添加了使用NSRange来处理选择的方法。 https://gist.github.com/4463233

答案 2 :(得分: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];
}

答案 3 :(得分:3)

这些都适合我:

[UITextField selectAll:self];

UITextField.selectedRange = NSMakeRange(0, 5);

但仅当文本字段是第一个响应者时。 (换句话说,只有在键盘显示的情况下才会显示。)因此,您需要在选择方法之前加上:

[UITextField becomeFirstResponder];

如果您希望文本显示为选中状态。

答案 4 :(得分: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];
}

答案 5 :(得分:0)

夫特

选择最后5个字符:

// 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!)
}

选择任意范围:

FillDataGrid()

我的完整答案是here

答案 6 :(得分:-1)

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!)
}