我的iPhone应用程序中有一个UITextField。我知道如何使文本字段选择其所有文本,但如何更改选择?假设我想选择最后5个字符,或者特定范围的字符,那可能吗?如果没有,我可以移动标记选择开始和结束的线条,就好像用户正在拖动它们一样吗?
答案 0 :(得分:29)
使用UITextField,你不能。但是如果你看到标题,你有_selectedRange和其他可能会在你添加一些类别时使用它们;)
现在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元素都有自己的UITextPosition
和UITextRange
私有子类,因此无法直接创建新值,但您可以使用文本字段为其创建你从文本的开头或结尾的引用和整数偏移。
您也可以反过来获取当前选择的起点和终点的整数表示:
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!)
}