2009-12-08 18 views
5

Zajmuję się programowaniem, w którym programuję programowo i dopuszczam maksymalnie 1 znak w UITextField.jak przesunąć kursor do następnego UITextField programowo?

To działa idealnie.

Ale po wpisaniu znaku, użytkownik musi ponownie stuknij w następnym UITextField zaprezentować klawiaturę

Po wpisaniu 1 znak kursor powinien automatycznie przejść do następnego UITextField.

Jak mogę to zrobić?

Odpowiedz

16

Złap delegata, który informuje, że twoje pole tekstowe zostało zmienione. Sprawdź, czy nowa długość wynosi 1. Jeśli tak, zadzwoń na becomeFirstResponder w następnym polu.

+0

jak to się robi? czy możesz pokazać przykładowy kod? – quantum

+0

'[textField sięFirstResponder]' – akashivskyy

4

Znalazłem to podejście ..

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string]; 

    if(textField == textField1) 
    { 
     if (textField1.text.length > 0 && range.length == 0) 
     { 
      return NO; 
     } 
     else { 
      [textField1 setText:newString]; 
      [textField2 becomeFirstResponder]; 
      return YES; 
     } 
    } 
    else if(textField == textField2) 
    { 
     if (textField2.text.length > 0 && range.length == 0) 
     { 
      return NO; 
     }else { 
      [textField2 setText:newString]; 
      [textField3 becomeFirstResponder]; 
      return YES; 
     } 
    } 
} 

Możemy to zrobić w inny sposób ... stwierdzenie tej linii w viewDidLoad i tym sposobem.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(endEditingTextField:) name:@"UITextFieldTextDidChangeNotification" object:txtfield1]; 

- (void) endEditingTextField:(NSNotification *)note { 
    if ([[txtfield1 text] length] > 0) 
    { 
     [txtfield1 resignFirstResponder]; 
     [txtfield2 becomeFirstResponder]; 
    } 
} 

Nadzieja to pomaga ...

+0

to nie działa? –

+0

To zadziałało dla mnie. W każdy sposób dodałem inny sposób, aby to zrobić. –

0

masz po prostu użyć

[textField'sName becomeFirstResponder]; 
1

Można to zrobić w 3 prostych krokach:

  1. bieżącym polu tekst powinien zrezygnuj z kursora.
  2. Oblicz następujące pole tekstowe
  3. Wykonaj następujące pole tekstowe, aby uzyskać kursor.

W kodzie:

if ([currentTextFieldWithCursor canResignFirstResponder]) [currentTextFieldWithCursor resignFirstResponder]; 
UITextField *followingTextField = // just get it! 
if ([followingTextField canBecomeFirstResponder]) [followingTextField becomeFirstResponder]; 

Nadzieję, że to pomaga.

2

Powyższe rozwiązanie nie działa. To rozwiązanie działa dla mnie:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string]; 

    if(firstCodeField == textField){ 
     [firstCodeField setText:newString]; 
     [secondCodeField becomeFirstResponder]; 
    } 
    if(secondCodeField == textField){ 
     [secondCodeField setText:newString]; 
     [thirdCodeField becomeFirstResponder]; 
    } 

    NSUInteger newLength = [textField.text length] + [string length] - range.length; 
    return (newLength > 1) ? NO : YES; 
} 
1

wystarczy ustawić

UITextFieldDelegate

i przeszłość tej metody w pliku .m. będzie działać Dla OTP pól tekstowych.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string]; 

    if(_txt1 == textField){ 
     if ([_txt1.text length] == 0) { 
      [_txt1 setText:newString]; 
       [_txt2 becomeFirstResponder ]; 
     } 

    } 
    if(_txt2 == textField){ 

     if ([_txt2.text length] == 0) { 
       [_txt2 setText:newString]; 
       [_txt3 becomeFirstResponder]; 
     } 

    } 

    if(_txt3 == textField){ 

     if ([_txt3.text length] == 0) { 
       [_txt3 setText:newString]; 
       [_txt4 becomeFirstResponder]; 
     } 

    } 

    if(_txt4 == textField){ 

     if ([_txt4.text length] == 0) { 
      [_txt4 setText:newString]; 
     } 

    } 

    NSUInteger newLength = [textField.text length] + [string length] - range.length; 
    return (newLength > 1 && newLength == 2) ? NO : YES; 
} 

Nadzieję, że to dzieło dla każdego. :)

Powiązane problemy