У меня есть UITextField в моем приложении для iPhone. Я знаю, как заставить текстовое поле выбрать весь текст, но как изменить выбор? Скажите, что я хотел выбрать последние 5 символов или определенный диапазон символов, возможно ли это? если нет, могу ли я перемещать строки, обозначающие начало и конец выделения, как если бы пользователь перетаскивал их?
Можно ли выбрать конкретный блок текста в UITextField?
Ответ 1
С 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];
Ответ 2
Чтобы выбрать определенный диапазон символов, вы можете сделать что-то подобное в 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
s. https://gist.github.com/4463233
Ответ 3
Чтобы выбрать имя файла без расширения файла, используйте это:
-(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];
}
Ответ 4
Эти обе работают для меня:
[UITextField selectAll:self];
и
UITextField.selectedRange = NSMakeRange(0, 5);
но только если текстовое поле является первым ответчиком. (Другими словами, только если клавиатура показывает.) Итак, вам нужно предшествовать любому из методов select с помощью этого:
[UITextField becomeFirstResponder];
если вы хотите, чтобы текст был выбран.
Ответ 5
Просто небольшое дополнение к принятому ответу. В 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];
}
Ответ 6
Swift
Выберите последние 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!)
}
Мой полный ответ здесь.
Ответ 7
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!)
}