Программно выделите весь текст в поле UITextField
Как я могу программно выделить весь текст в UITextField?
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
следует удалить существующее значение, когда пользователь начинает редактирование (это значение по умолчанию для secureUITextFields
).
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
Если вы имеете в виду на самом деле выделите текст (как в выделить), то это может быть полезно: