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

Выполните текущее задание autocorrect UITextField при нажатии другой кнопки

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

Кто-нибудь знает, как программно выполнить видимое в настоящее время предложение автокоррекции/автозаполнения UITextField, когда активируется полностью отдельный элемент управления? Очевидно, это возможно.

4b9b3361

Ответ 1

Вызовите -resignFirstResponder в поле. Это заставляет его принимать автокоррекцию. Если вы не хотите отклонять клавиатуру, вы можете сразу же последовать этому вызову с помощью -becomeFirstResponder.

Ответ 2

Для 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]];
}

Ответ 3

Так как отставка и повторное принятие первого ответчика могут иметь побочные эффекты (множество уведомлений, триггеры show/hide на клавиатуре и т.д.), я искал альтернативный, менее жестокий способ. После некоторого поиска я обнаружил, что это все, что вам нужно сделать, чтобы принять автокоррекции в UITextView (или UITextField fwiw):

[textView.inputDelegate selectionWillChange: textView];
[textView.inputDelegate selectionDidChange: textView];

Надеюсь, что это поможет;)

Ответ 4

Этот код решал проблему в моем случае.

[self.textView rejectAutoCorrect];

Код категории.

@implementation UITextView (rejectAutoCorrect)

- (void)rejectAutoCorrect
{
    if ([self isFirstResponder])
    {
        [self.inputDelegate selectionWillChange:self];
        [self.inputDelegate selectionDidChange:self];
    }
}

@end

Ответ 5

Основываясь на предложениях 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

Ответ 6

Здесь обсуждается быстрое чистое обсуждение решений...

Создайте фиктивный текстовый комментарий, чтобы сделать ответчик, а затем вернитесь к исходному текстуру. убедитесь, что это был первый ответчик.

Настройка:

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];
    }
}