Метод:

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

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

Ответы на вопрос(6)

Решение Вопроса

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

 Jeremy Fuller06 янв. 2011 г., 18:46
Спасибо, это сработало отлично. Ваш дополнительный комментарий также был весьма полезным!
 Lily Ballard06 янв. 2011 г., 05:01
Если вы собираетесь позвонить-becomeFirstResponder Опять же, убедитесь, что он действительно имел фокус для начала. Использоватьediting свойство проверить это (проверкаisFirstResponder не работает на UITextFields).
 esilver27 сент. 2012 г., 17:46
Есть ли способ сделать это без отставки первого респондента, который вызывает срабатывание обоих клавиатур WillHide и клавиатура DidHide?
 Lily Ballard27 сент. 2012 г., 19:54
@esilver: Не то, чтобы я знал. Я не пытался найти решение этой проблемы в течение многих лет, поэтому, возможно, есть отдельный путь.
 Jeremy Fuller06 янв. 2011 г., 04:59
Отлично, позвольте мне попробовать это.

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

настроить:

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

вы можете сделать это без отставки первого респондента, добавив другое текстовое полеcomeFirstResponder, а затем присвоив соответствующее текстовое полеcomeFirstResponder. В этом случае клавиатура не будет двигаться и не будет вызывать никаких скрытых уведомлений. Если у вас нет других текстовых полей, создайте фиктивное текстовое поле и установите для него значение 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]];
}
 Conor22 июл. 2013 г., 20:12
У меня был BOOL, чтобы игнорировать делегатскую клавиатуру, будут появляться сообщения, но все же остались проблемы с индексом в табличном представлении, обновляющемся с видимой анимацией. Спасибо.
 Trunal Bhanse23 янв. 2014 г., 23:30
работал как шарм. Спасибо!
 Valentin Shergin08 окт. 2014 г., 20:46
И не забудьте установить свойстваinputAccessoryView, inputView а такжеkeyboardType в тех же ценностях, что и оригиналUITextView чтобы избежать нежелательных событий клавиатуры.
 Rahul Jaswa19 февр. 2014 г., 21:09
Любой, кто пробует использовать фиктивную стратегию текстового поля, должен иметь тот же родительский суперпредставление, иначе сталкожный ответ будет игнорироваться!

ыть побочные эффекты (много уведомлений, триггеры показа / скрытия клавиатуры и т. Д.), Я искал альтернативный, менее жестокий способ. После некоторых поисков я обнаружил, что это все, что вам нужно сделать, чтобы принять автокоррекцию вUITextView (или жеUITextField FWIW):

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

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

 jnoor14 мар. 2016 г., 07:19
Работал на меня. iOS 9.2.1. Спасибо Макс.
 Alston12 февр. 2015 г., 09:27
не работал для меня
 Antonio01 нояб. 2018 г., 18:53
этот метод менее навязчив, и он исправляет некоторые нежелательные анимации в табличном представлении, которые вместо этого происходят, используя метод отставки / становления первым респондентом

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

[self.textView rejectAutoCorrect];

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

@implementation UITextView (rejectAutoCorrect)

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

@end
 Nikita Ivaniushchenko29 апр. 2015 г., 09:23
Поскольку вы вызываете только методыinputDelegateэтот код работает случайно. Я бы сделал этоself.selectedRange = NSMakeRange(0, self.text.length);

вот метод категории, который мы написали для обработки любых ожидающих предложений автозамены без отклонения клавиатуры (и без вызова завещания / скрытия / отображения уведомлений).

@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

Ваш ответ на вопрос