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

Sun*_*314 24 iphone textselection uitextfield iphone-sdk-3.0

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

nac*_*o4d 31

使用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];
Run Code Online (Sandbox Code Playgroud)


Ant*_*tox 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;
Run Code Online (Sandbox Code Playgroud)

由于UITextFields和其他UIKit元素具有自己的私有子类,UITextPosition并且UITextRange您无法直接创建新值,但您可以使用文本字段为您创建它们,从引用到文本的开头或结尾以及整数偏移量.

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

int start = [self offsetFromPosition:self.beginningOfDocument toPosition:self.selectedTextRange.start];
int end = [self offsetFromPosition:self.beginningOfDocument toPosition:self.selectedTextRange.end];
Run Code Online (Sandbox Code Playgroud)

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


ork*_*den 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];
}
Run Code Online (Sandbox Code Playgroud)