2011-01-06 21 views
25

Wdrażam czat w mojej aplikacji, bardzo podobny do wbudowanej aplikacji Wiadomości iPhone'a. Mam UITextField obok przycisku. Użytkownik wpisuje coś w polu tekstowym i bardzo często pole tekstowe sugeruje różne autokorekty. W wbudowanej aplikacji Wiadomości naciśnięcie przycisku Wyślij spowoduje wyświetlenie aktualnie widocznej sugestii autokorekty. Szukam tego zachowania w mojej aplikacji, ale nie udało mi się znaleźć niczego.Wykonaj aktualną propozycję autokorekty UITextField po naciśnięciu innego przycisku.

Czy ktoś wie o sposobie programowego wykonania aktualnie widocznej sugestii autokorekcji/autouzupełniania UITextField, gdy aktywowane jest całkowicie oddzielne sterowanie? Jest to oczywiście możliwe.

Odpowiedz

37

Zadzwoń na -resignFirstResponder na polu. To zmusza ją do zaakceptowania autokorekty. Jeśli nie chcesz odrzucić klawiatury, możesz od razu ją wykonać, dzwoniąc pod numer -becomeFirstResponder.

+0

Doskonale, pozwól mi spróbować. –

+2

Jeśli zamierzasz ponownie wywołać '-becomeFirstResponder', upewnij się, że na początku miał on fokus. Użyj tej właściwości, aby przetestować to (sprawdzanie 'isFirstResponder' nie działa na UITextFields). –

+0

Dziękuję, że działało idealnie. Twój dodatkowy komentarz również był bardzo pomocny! –

10

Dla esilver: możesz to zrobić bez rezygnacji z pierwszego reagowania, ponieważ inne pole tekstowe staje sięFirstResponder, a następnie odpowiednie pole tekstowe staje sięFirstResponder. Klawiatura nie będzie się poruszać w tym przypadku i nie będzie wyzwalać żadnych powiadomień ukrywania. Jeśli nie masz żadnych innych pól tekstowych, utwórz pozorne pole tekstowe i ustaw je na 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]]; 
} 
+1

Miałem BOOL, aby zignorować klawiaturę delegata pojawi się wiadomości, ale nadal pozostały problemy z indeksem w widoku tabeli aktualizacji z widoczną animacją. Dziękuję Ci. – Conor

+0

pracował jak urok. Dzięki! –

+4

Dla każdego, kto wypróbowuje strategię pola tekstowego dummy, upewnij się, że ma to samo nadrzędne nadrzędne, lub w przeciwnym razieRozpocześnik zostanie zignorowany! –

0

Opierając się na sugestie Nick blokujący, oto jest metoda kategoria pisaliśmy przetwarzać wszelkie oczekujące propozycje autokorekty bez odwoływania klawiaturę (bez wyzwalania wolę/kryli/pokazywanie powiadomień).

@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 
0

Oto krótkie podsumowanie rozwiązań czysty omówione ...

Tworzenie obojętne TextView aby Responder, a następnie powrócić do pierwotnego TextView. upewnij się, że to pierwsza odpowiedź.

setup:

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

Metoda:

- (void)commitSuggestions { 
    if([self.textView isFirstResponder]) { 
     [self.dummyTextView becomeFirstResponder]; 
     [self.textView becomeFirstResponder]; 
    } 
} 
5

Od rezygnacji i re-zakładając pierwszy responder mogą mieć skutki uboczne (dużo zgłoszeń, klawiatura pokaż/ukryj wyzwalacze itp), Szukałem alternatywnego, mniej brutalnego sposobu. Po dłuższego poszukiwania, znalazłem to jest wszystko, co trzeba zrobić, aby zaakceptować autocorrections w UITextView (lub UITextField FWIW):

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

nadzieję, że pomoże;)

+0

nie działa dla mnie – Alston

+0

Pracowałem dla mnie. iOS 9.2.1. Dzięki Max. – jnoor

3

ten kod było rozwiązać problem w moim przypadku .

Kod kategorii.

@implementation UITextView (rejectAutoCorrect) 

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

@end 
+0

Ponieważ tylko wywołujesz metody 'inputDelegate', ten kod działa przez przypadek. Zrobiłbym to 'self.selectedRange = NSMakeRange (0, self.text.length);' –

Powiązane problemy