Подтвердить что ты не робот

Можно ли выбрать конкретный блок текста в UITextField?

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

4b9b3361

Ответ 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!)
}