Программно выделите весь текст в поле UITextField


Как я могу программно выделить весь текст в UITextField?

12 63

12 ответов:

оказывается, вызов-selectAll: с ненулевым отправителем отображается меню. Вызов его с нулем приводит к тому, что он выбирает текст, но не отображает меню.

Я попробовал это после того, как мой отчет об ошибке вернулся из Apple с предложением, что я передаю nil вместо себя.

нет необходимости гадить с UIMenuController или другими API выбора.

вот что сделал трюк для меня:

[self.titleField setSelectedTextRange:[self.titleField textRangeFromPosition:self.titleField.beginningOfDocument toPosition:self.titleField.endOfDocument]];

довольно некрасиво, но это работает, так что не будет sharedMenuController показано!

чтобы исправить проблему "работает только каждый второй раз" используйте следующее:

    __weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
    __strong __typeof(weakSelf) strongSelf = weakSelf;
    UITextRange *range = [strongSelf textRangeFromPosition:strongSelf.beginningOfDocument toPosition:strongSelf.endOfDocument];
    [strongSelf setSelectedTextRange:range];
});

спасибо Эрик Бейкер (только что отредактировано из комментария здесь)

Я только что проверил это, чтобы проверить комментарий Мирко выше, но мой тест подтверждает, что selectAll: фактически выделяет весь текст, когда он отправляется в само поле UITextField.

обратите внимание, что текст будет немедленно скрыт с помощью действий вырезать | копировать | вставить, но на ваш вопрос, это именно то, что появляется, когда пользователь нажимает "выбрать Все" для начала.

решение, с которым я собираюсь, следует, обратите внимание, что вторая строка временно скроет диалог вырезать / копировать / вставить, без отключения его для явного выбора пользователя

[_myTextField selectAll:self];
[UIMenuController sharedMenuController].menuVisible = NO;

использовать то, что вам нужно

 [yourtextField becomeFirstResponder]; //puts cursor on text field

 [yourtextField selectAll:nil];        //highlights text

 [yourtextField selectAll:self];       //highlights text and shows menu(cut copy paste)

Свифт

выделите весь текст в UITextField:

textField.selectedTextRange = textField.textRangeFromPosition(textField.beginningOfDocument, toPosition: textField.endOfDocument)

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

Это лучшее решение, которое я нашел. Нет sharedMenuController, и он работает последовательно:

    -(void)textFieldDidBeginEditing:(UITextField *)textField
{
    [textField performSelector:@selector(selectAll:) withObject:nil afterDelay:0.1];
}

для того, чтобы выделить текст, текстовое поле должно быть редактируемым. Чтобы узнать, когда текстовое поле доступно для редактирования, используйте методы делегата:

- (void)textFieldDidBeginEditing:(UITextField *)textField
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

я не думаю, что textFieldShouldBeginEditing: требуется, но это то, что я использовал в своей реализации.

- (void)textFieldDidBeginEditing:(UITextField *)textField{
    [textField selectAll:textField];
}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
    return YES;
}

передача в nil для selectAll: не будет отображаться меню.

к сожалению, я не думаю, что вы можете сделать это.

Я не уверен, что это поможет вам, но setClearsOnBeginEditing позволяет указать, что UITextField следует удалить существующее значение, когда пользователь начинает редактирование (это значение по умолчанию для secure UITextFields).

Swift 3:

textField.selectAll(self)
UITextField *tf = yourTF;
// hide cursor (you have store default color!!!)
[[tf valueForKey:@"textInputTraits"] setValue:[UIColor clearColor]
                                       forKey:@"insertionPointColor"];
// enable selection
[tf selectAll:self];
// insert your string here
// and select nothing (!!!)
[tf setMarkedText:@"Egor"
    selectedRange:NSMakeRange(0, 0)];

готово!

Я создаю пользовательский вид предупреждения, который содержит UITextField внутри. Я нашел проблему в текстовом поле, что:beginningOfDocument имеет значение только если текстовое поле добавляется на экран & becomeFirstResponder называется.

иначе beginningOfDocument возвращает nil и [UITextField textRangeFromPosition:] не может получить значение.

Итак, вот мой пример кода для решения этого дела.

UIWindow *window = [[[UIApplication sharedApplication] windows] firstObject];
[window addSubview:theAlertView]; // textfield must be added as a subview of screen first
UITextField *textField = theAlertView.textField;
[textField becomeFirstResponder]; // then call to show keyboard and cursor 
UITextRange *range = [textField textRangeFromPosition:textField.beginningOfDocument toPosition:textField.endOfDocument]; // at this time, we could get beginningOfDocument
[textField setSelectedTextRange:range]; // Finally, it works!!!

Если вы имеете в виду, как бы вы позволили пользователю редактировать текст в поле uitextfield, то просто назначьте ему firstResponder:

[textField becomeFirstResponder]

Если вы имеете в виду, как вы получаете текст в поле uitextfield, чем это будет делать это:

textField.text

Если вы имеете в виду на самом деле выделите текст (как в выделить), то это может быть полезно:

selectAll