Як я можу програмно виділити весь текст у UITextField?
Відповіді:
Виявляється, зателефонувавши -selectAll: із ненульовим відправником відображається меню. Виклик його з нулем змушує його виділяти текст, але не відображати меню.
Я спробував це після того, як мій звіт про помилку про це повернувся від Apple із пропозицією передати нуль замість себе.
Не потрібно гадити з UIMenuController чи іншими API вибору.
Ось що для мене зробило фокус:
[self.titleField setSelectedTextRange:[self.titleField textRangeFromPosition:self.titleField.beginningOfDocument toPosition:self.titleField.endOfDocument]];
Досить потворно, але це працює, тому не буде показано спільнийMenuController!
Щоб виправити проблему "працює лише кожен другий раз", використовуйте наступне:
__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];
});
Дякую Еріку Бейкеру (щойно відредаговано з коментаря тут)
__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.
Зверніть увагу, що текст буде негайно затемнений за допомогою CUT | КОПІЮВАННЯ | ВСТАНОВИТИ дії, але на ваше запитання це саме те, що з’являється, коли користувач натискає "Вибрати все" для початку.
Рішення, з яким я піду, слід зазначити, що другий рядок тимчасово приховає діалогове вікно CUT / COPY / PASTE, не відключаючи його для явного вибору користувача
[_myTextField selectAll:self];
[UIMenuController sharedMenuController].menuVisible = NO;
[UIMenuController sharedMenuController].menuVisible = NO;
так що ця лінія не матиме жодного ефекту.
setSelectedRange:
.
Використовуйте те, що вам потрібно
ObjC
[yourtextField becomeFirstResponder]; //puts cursor on text field
[yourtextField selectAll:nil]; //highlights text
[yourtextField selectAll:self]; //highlights text and shows menu(cut copy paste)
Стрімкий
yourTextField.becomeFirstResponder() //puts cursor on text field
yourTextField.selectAll(nil) //highlights text
yourTextField.selectAll(self) //highlights text and shows menu(cut copy paste)
selectAll
дзвінок viewDidAppear
. Це не буде працювати, якщо розміщено в viewDidLoad
або viewWillAppear
.
Це найкраще рішення, яке я знайшов. Немає sharedMenuController, і він працює послідовно:
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
[textField performSelector:@selector(selectAll:) withObject:nil afterDelay:0.1];
}
Стрімкий
Виділіть увесь текст у UITextField
:
textField.selectedTextRange = textField.textRange(from: textField.beginningOfDocument, to: textField.endOfDocument)
Повна моя відповідь тут: https://stackoverflow.com/a/34922332/3681880
[textField selectAll:nil]
, було б непогано перерахувати це.
Щоб мати змогу виділити текст, текстове поле має редагуватися. Щоб дізнатись, коли текстове поле можна редагувати, використовуйте методи делегування:
- (void)textFieldDidBeginEditing:(UITextField *)textField
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
Я не думаю, що textFieldShouldBeginEditing: потрібно, але це те, що я використав у своїй реалізації.
- (void)textFieldDidBeginEditing:(UITextField *)textField{
[textField selectAll:textField];
}
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
return YES;
}
Перехід на нуль для вибору All: меню не відображатиметься.
Свіфт 3:
textField.selectAll(self)
Я створюю власний подання сповіщення, яке містить 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 *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)];
Готово!
Якщо ви маєте на увазі, як би ви дозволили користувачеві редагувати текст у полі uitext, то просто призначте йому firstResponder:
[textField becomeFirstResponder]
Якщо ви маєте на увазі, як ви отримуєте текст у полі uitext, це зробить це:
textField.text
Якщо ви маєте на увазі насправді виділити текст (як підкреслити його), це може бути корисно: