Могу ли я выбрать определенный блок текста в UITextField? - PullRequest
23 голосов
/ 19 июля 2010

У меня в приложении для iPhone есть UITextField.Я знаю, как заставить текстовое поле выделять весь его текст, но как можно изменить выделение?Скажем, я хотел выбрать последние 5 символов или конкретный диапазон символов, это возможно?если нет, могу ли я переместить линии, отмечающие начало и конец выделения, как если бы пользователь их перетаскивал?

Ответы [ 6 ]

30 голосов
/ 19 июля 2010

С 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];
13 голосов
/ 05 января 2013

Чтобы выбрать определенный диапазон символов, вы можете сделать что-то подобное в 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 s и другие элементы 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

5 голосов
/ 11 декабря 2013

Чтобы выбрать имя файла без расширения, используйте это:

-(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 голосов
/ 27 апреля 2011

Они оба работают для меня:

[UITextField selectAll:self];

и:

UITextField.selectedRange = NSMakeRange(0, 5);

, но только если текстовое поле является первым респондентом.(Другими словами, только если клавиатура отображается.) Таким образом, перед любым из методов выбора необходимо указать следующее:

[UITextField becomeFirstResponder];

, если вы хотите, чтобы текст отображался выделенным.

1 голос
/ 31 августа 2013

Просто небольшое дополнение к принятому ответу. В 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];
}
0 голосов
/ 21 января 2016

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

Мой полный ответ здесь .

...