Выполнить текущее предложение автозамены UITextField при нажатии другой кнопки - PullRequest
26 голосов
/ 06 января 2011

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

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

Ответы [ 6 ]

38 голосов
/ 06 января 2011

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

10 голосов
/ 10 апреля 2013

Для esilver: вы можете сделать это без отставки первого респондента, добавив другое текстовое поле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]];
}
6 голосов
/ 09 января 2015

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

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

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

3 голосов
/ 27 апреля 2015

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

[self.textView rejectAutoCorrect];

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

@implementation UITextView (rejectAutoCorrect)

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

@end
0 голосов
/ 08 августа 2014

Вот краткий обзор обсуждаемых решений ...

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

установка:

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];
    }
}
0 голосов
/ 24 февраля 2014

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

@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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...