2012-04-17 14 views
29

Jak zmienić klucz powrotny na iPhone podczas edycji. Wiem oJak zmienić parametr returnKeyType podczas edycji?

myTextField.returnKeyType = UIReturnKeySearch; 

Jednak ta działa tylko wtedy, gdy zadzwonię [myTextField resignFirstResponder]; następnie [myTextField becomeFirstResponder]; który ukrywa klawiaturę następnie sprowadza go z powrotem. W przeciwnym razie pozostanie tak jak wcześniej, w tym przypadku było to "Go". Muszę je zmieniać w zależności od wprowadzanych znaków.


W jednym wierszu: Jak zmienić typ klawisza powrotu klawisza, gdy jest on wciąż edytowany?

Odpowiedz

47

[textField reloadInputViews] wydaje rade ...

+0

Spróbuje jutro. dzięki –

+1

Czy firmy. Kluczem jest robienie rzeczy we właściwej kolejności, np. [myTextField getFirstResponder]; myTextField.returnKeyType = UIReturnKeyDone; [myTextField reloadInputViews]; –

+8

reloadInputViews ma pewne zastrzeżenia. Zobacz http://stackoverflow.com/questions/5958427/can-i-change-property-uireturnkeytype-of-uitextfield-dynamicznie. Zmienia także klawiaturę z powrotem do stanu początkowego. Więc jeśli użytkownik przełączył się na inny układ klawiatury (cyfry, znaki interpunkcyjne itp.), Ten stan zostanie utracony. –

0

Czy spróbujesz użyć textField za Delegat:

- (BOOL) textFieldShouldBeginEditing: (UITextField *) textField { textField.returnKeyType = UIReturnKeySearch; return YES; }

+0

Tak, ale nadal wymaga to zamknięcia i otwarcia klawiatury. Mam odpowiedź, więc i tak dzięki. –

6

Znalazłem to chwilę, zapomniałem zamieścić tutaj. Używam:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange: 
(NSRange)range replacementString:(NSString *)string { 
    [self performSelector:@selector(addressBarTextDidChange:) withObject:nil afterDelay:0.1]; 
    return YES; 
} 

-(void)addressBarTextDidChange:(NSString *)text { 
    NSString *addressText = @"..."; //Wherever you get your text from... 
    if ([addressText isEqualToString:@""]==NO) { 
     if ([addressText rangeOfString:@" "].location != NSNotFound) { 
      //[addressBarTextField setReturnKeyType:UIReturnKeySearch]; 
      if (addressBarTextField.returnKeyType!=UIReturnKeySearch) { 
       [UIView beginAnimations:nil context:NULL]; //Setup the animation. 
       [UIView setAnimationDuration:0.0]; //The duration for the animation. 
       [addressBarTextField resignFirstResponder]; 
       addressBarTextField.returnKeyType = UIReturnKeySearch; 
       [addressBarTextField becomeFirstResponder]; 
       [UIView commitAnimations]; 
      } 
     } else { 
      //[addressBarTextField setReturnKeyType:UIReturnKeyGo]; 
      if (addressBarTextField.returnKeyType!=UIReturnKeyGo) { 
       [UIView beginAnimations:nil context:NULL]; //Setup the animation. 
       [UIView setAnimationDuration:0.0]; //The duration for the animation. 
       [addressBarTextField resignFirstResponder]; 
       addressBarTextField.returnKeyType = UIReturnKeyGo; 
       [addressBarTextField becomeFirstResponder]; 
       [UIView commitAnimations]; 
      } 
     } 

    } else { 
     if (addressBarTextField.returnKeyType!=UIReturnKeyDone) { 
      [UIView beginAnimations:nil context:NULL]; //Setup the animation. 
      [UIView setAnimationDuration:0.0]; //The duration for the animation. 
      [addressBarTextField resignFirstResponder]; 
      addressBarTextField.returnKeyType = UIReturnKeyDone; 
      [addressBarTextField becomeFirstResponder]; 
      [UIView commitAnimations]; 
     } 
    } 
} 

Zasadniczo jestem animowanie klawiaturę i wyjść na okres 0,0 sekundy (tak, użytkownik nie będzie mógł go zobaczyć). Sprawdzam również, czy klawiatura nie jest jeszcze tą, którą chcę przed przełączeniem, ponieważ ciągłe przełączanie powoduje opóźnienie.

+0

to zadziałało dla mnie - dzięki! – drudru

2

zrobiłem niestandardową kategorię, aby odsłonić returnKeyType. Po prostu zaimportuj i wykonaj self.addField.returnKeyType = UIReturnKeySearch; lub cokolwiek chcesz ustawić jako returnKeyType. Możesz także użyć go dynamicznie, gdy klawiatura jest już otwarta. Zostanie automatycznie odświeżony.

Oto ona:

Interfejs:

/* 

Simple hack for exposing returnKeyType for UISearchBar without private APIs 
For you from CodeBuffet ;) 


Enjoy! 

~PW 

*/ 

#import <UIKit/UIKit.h> 

@interface UISearchBar (ReturnType) 

@property (nonatomic, readwrite) UIReturnKeyType returnKeyType; 

@end 

Realizacja:

#import "UISearchBar+ReturnType.h" 

@implementation UISearchBar (ReturnType) 

UITextField *textField; 

- (UITextField *) traverseForTextViewInViews: (NSArray*) views 
{ 
    // Traverse over all views recursively until we find the tresure TextField hidden deep the UISearchBar ocean! 
    for(UIView *subView in views) { 
     if([subView conformsToProtocol:@protocol(UITextInputTraits)]) { 
      return (UITextField *) subView; 
     } 
     UITextField *tv = [self traverseForTextViewInViews:subView.subviews]; 
     if (tv) { 
      return tv; 
     } 
    } 
    return nil; 
} 

#pragma mark Custom Setters & Getters 

- (void)setReturnKeyType:(UIReturnKeyType)returnKeyType 
{ 
    if (!textField) { 
     textField = [self traverseForTextViewInViews:self.subviews]; 
    } 
    textField.returnKeyType = returnKeyType; 
    [self reloadInputViews]; 
    [textField reloadInputViews]; 
} 

- (UIReturnKeyType)returnKeyType 
{ 
    if (!textField) { 
     textField = [self traverseForTextViewInViews:self.subviews]; 
    } 
    return textField.returnKeyType; 
} 

@end 
+0

Co zadziwiające, nadal działa w iOS 9.3. Należy wyszukać subview, który spełnia zarówno parametry UITextInputTraits (w celu ustawienia typu returnKeyType), jak i UIResponder (aby można było wysyłać reloadInputViews). Nie ma potrzeby wysyłania reloadInputViews do "self". Ponadto, nie możesz tego wszystkiego napisać w Swift - nie ma możliwości ustawienia returnKeyType (jest to właściwość opcjonalna) - przynajmniej do tego samego musisz użyć Objective C. Najmilszą częścią twojego rozwiązania jest to, że klawiatura się nie porusza! –

+0

Niestety, po eksperymentach, stwierdzam, że mogę przejść od słowa Domyślne do następnego - to działa dobrze. Ale jeśli użytkownik usunie tekst, a ja chcę wrócić do domyślnego, to nie "bierze" - pozostaje w Next (przynajmniej na symulatorze). Westchnienie. Naprawdę miałem nadzieję, że to będzie działać cały czas ... –

+0

Nowy problem - i naprawdę poważny - tak musiał porzucić to. Jeśli określisz klawiaturę "NumberPad" i użyjesz tej sztuczki, klawiatura zostanie "zablokowana" i nie zostanie odrzucona - przynajmniej pozostaje obraz klawiatury. Westchnienie. Więc wróciliśmy do starej techniki "zrezygnuj-zostań". –

4

W moim przypadku to, co pracował był następujący:

sender.returnKeyType=UIReturnKeyNext; 
[sender reloadInputViews]; 
[sender resignFirstResponder]; 
[sender becomeFirstResponder]; 

musiałem wymusić risignFir stResponder, po którym następuje stała pozycjaFirstResponder.

+1

Pamiętaj, że jest to wadliwe z polem hasła (secureTextEntry). Wywołanie metody resignFirstResponder & becomeFirstResponder resetuje pole tak, że następny wpis klawiatury zastępuje poprzedni tekst (co jest typowym zachowaniem w polu hasła). –

1

Zrobiłem to z tych 3 linie kodu:

[sender setReturnKeyType:UIReturnKeyDone]; 
[sender resignFirstResponder]; 
[sender becomeFirstResponder]; 
+0

Musisz uporać się z odrzucaniem klawiatury i ponownym pojawieniem się. Nie niemożliwe, ale niechlujne. –

1

musiałem zaktualizować returnKeyType (Dalej < -> Go) na podstawie aktualnej treści tekstowym. Metoda reloadInputViews na polu tekstowym nie działała po ustawieniu samego parametru returnKeyType. Jak wspomniały inne plakaty, konieczne było zastosowanie metody resignFirstResponder, po której nastąpił element stałopierwszy. W mojej sytuacji, gdy pole tekstowe stało się pierwszym Odwróceniem i wyświetlonym klawiaturą, animowałoby to zwolnienie i ponowne pojawienie się klawiatury. Na mniejszych urządzeniach lub w trybie poziomym powodowałoby to również chwilowy skok widoku zawierającego pole tekstowe. Rozwiązaniem, które znalazłem, aby ukryć to niechciane zachowanie, jest umieszczenie elementu resignFirstResponder i przejście do elementu FirstResponder w bloku animacji trwającym 0 sekund.

  [UIView animateWithDuration:0.0 
            delay:0.0 
           options:0 
          animations:^{ 
           [textField reloadInputViews]; 
           [textField resignFirstResponder]; 
           [textField becomeFirstResponder]; 
          } 
          completion:nil]; 
0

Swift 3

Po zmianie returnKeyType swojego UITextField lub UITextView rozmowy:

textFieldOrView.resignFirstResponder() 
textFieldOrView.becomeFirstResponder() 

Chociaż nazywając textFieldOrView.reloadInputViews() prace w niektórych przypadkach, to nie jest tak bezpieczne, jak w powyższym roztworze.

Powiązane problemy