Ответ 1
Вызовите -resignFirstResponder
в поле. Это заставляет его принимать автокоррекцию. Если вы не хотите отклонять клавиатуру, вы можете сразу же последовать этому вызову с помощью -becomeFirstResponder
.
Я использую чат в своем приложении, очень похожий на приложение для встроенных сообщений iPhone. У меня есть UITextField рядом с кнопкой. Пользователь вводит что-то в текстовое поле, и очень часто текстовое поле предлагает различные автокоррекции. Во встроенном приложении "Сообщения" нажатие кнопки "Отправить" приведет к выполнению предложенного в настоящее время варианта автокоррекции. Я ищу это поведение в своем приложении, но ничего не нашел.
Кто-нибудь знает, как программно выполнить видимое в настоящее время предложение автокоррекции/автозаполнения UITextField, когда активируется полностью отдельный элемент управления? Очевидно, это возможно.
Вызовите -resignFirstResponder
в поле. Это заставляет его принимать автокоррекцию. Если вы не хотите отклонять клавиатуру, вы можете сразу же последовать этому вызову с помощью -becomeFirstResponder
.
Для esilver: вы можете сделать это, не откладывая первого ответчика, имея другое текстовое поле getFirstResponder, а затем имея соответствующее текстовое поле beFirstResponder. В этом случае клавиатура не будет перемещаться и не запускать никаких скрытых уведомлений. Если у вас нет других текстовых полей, создайте фиктивное текстовое поле и установите его в hidden = YES.
-(void)tappedSendButton:(id)sender
{
// This hack is in place to force auto-corrections to be applied
// before the text is sent.
[self.dummyTextField becomeFirstResponder];
[self.toolbar.textView becomeFirstResponder];
[self sendChatWithBody: [self.toolbar.textView.text copy]];
}
Так как отставка и повторное принятие первого ответчика могут иметь побочные эффекты (множество уведомлений, триггеры show/hide на клавиатуре и т.д.), я искал альтернативный, менее жестокий способ. После некоторого поиска я обнаружил, что это все, что вам нужно сделать, чтобы принять автокоррекции в UITextView
(или UITextField
fwiw):
[textView.inputDelegate selectionWillChange: textView];
[textView.inputDelegate selectionDidChange: textView];
Надеюсь, что это поможет;)
Этот код решал проблему в моем случае.
[self.textView rejectAutoCorrect];
Код категории.
@implementation UITextView (rejectAutoCorrect)
- (void)rejectAutoCorrect
{
if ([self isFirstResponder])
{
[self.inputDelegate selectionWillChange:self];
[self.inputDelegate selectionDidChange:self];
}
}
@end
Основываясь на предложениях Nick Locking, здесь приведен метод категорий, который мы написали, чтобы обрабатывать любые ожидающие решения автозамены, не отпуская клавиатуру (и не вызывая при этом скрытие/показ уведомлений).
@implementation UITextView (SuggestionHelpers)
- (void)acceptSuggestionWithoutDismissingKeyboard {
// by making another UITextField the first responder, the keyboard won't try to hide
UITextField *temp = [[[self class] alloc] initWithFrame:CGRectZero];
temp.hidden = YES;
[[self superview] addSubview:temp];
[temp becomeFirstResponder];
[self becomeFirstResponder];
[temp removeFromSuperview];
}
@end
Здесь обсуждается быстрое чистое обсуждение решений...
Создайте фиктивный текстовый комментарий, чтобы сделать ответчик, а затем вернитесь к исходному текстуру. убедитесь, что это был первый ответчик.
Настройка:
self.textView = [[UITextView alloc] initWithFrame:self.view];
[self.view addSubview:self.textView];
self.dummyTextView = [[UITextView alloc] init];
[self.dummyTextView setHidden:YES];
[self.view addSubview:self.dummyTextView];
Метод:
- (void)commitSuggestions {
if([self.textView isFirstResponder]) {
[self.dummyTextView becomeFirstResponder];
[self.textView becomeFirstResponder];
}
}