2012-02-10 11 views
29

Mam aplikację na iPada, która zawiera formularz rejestracji. Formularz jest bardzo prosty i zawiera tylko dwa UITextFields, które są dla Name Adres e-mail: &.Przenoszenie się do następnego UITextField Po kliknięciu "Dalej"

Pierwszy TextField jest dla kandydatów Nazwa, Po wprowadzeniu ich nazwy i naciśnięciu klawisza "Dalej" na klawiaturze chcę, aby to automatycznie przejść do następnego adresu e-mail TextField do edycji.

Każdy pomysł, jak ustawić następny przycisk na klawiaturze, aby przejść do następnej klawiatury?

Dzięki

Odpowiedz

72

Musisz zrobić kontroler widok pełnomocnik UITextField, i wdrożyć UITextField metodę Delegat:

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    if (textField == nameField) { 
     [textField resignFirstResponder]; 
     [emailField becomeFirstResponder]; 
    } else if (textField == emailField) { 
     // here you can define what happens 
     // when user presses return on the email field 
    } 
    return YES; 
} 

wersję SWIFT:

func textFieldShouldReturn(textField: UITextField) -> Bool { 
    if textField == nameField { 
     textField.resignFirstResponder() 
     emailField.becomeFirstResponder() 
    } else if textField == emailField { 
     // here you can define what happens 
     // when user presses return on the email field 
    } 
    return true 
} 

Można też aby przewinąć widok, aby pole email było widoczne. Jeśli kontroler widoku jest wystąpienie UITableViewController, powinno to nastąpić automatycznie. Jeśli nie, powinieneś przeczytać this Apple document, a zwłaszcza Przenoszącej się zawartości, która znajduje się pod częścią klawiatury.

+0

Dzięki Lawicko. Kod działał idealnie z polem wiadomości e-mail ustawionym na [email resignFirstResponder] ;. Dzięki jeszcze raz. –

+3

@lawicko Oświadczenie "[textField resignFirstResponder];" w powyższym kodzie nie jest ważne. Podczas gdy pola wciąż znajdują się w formularzu, po prostu przenieś 'staćNiepowiedzialnym_specyfikatorem' do następnego pola:' [emailFelest getFirstResponder]; ' – Malloc

+0

@Malloc Masz rację, dla prostych przypadków, gdy' textField' nie jest podklasą UITextField i nie robi nic konkretnego, gdy status pierwszego respondenta jest zrzeczony. Jednak mój kod działa dobrze we wszystkich przypadkach, w tym w bardziej skomplikowanych. Zobacz [tutaj] (http://developer.apple.com/library/ios/documentation/uikit/reference/UIResponder_Class/Reference/Reference.html#//apple_ref/occ/instm/UIResponder/resignFirstResponder), aby dowiedzieć się, dlaczego ' resighFirstResponder' może być nadpisany. – lawicko

10

Dodatkowo do @lawicko „s Odpowiedź często zmienić tekst przycisku, aby podać ten końcowy akcent wykończeniowy (np mówi next gdy istnieje więcej pól, a następnie done gdy na ostatni):

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    BOOL isLastTextField = //.. your logic to figure out if the current text field is the last 

    if (isLastTextField) { 
     textField.returnKeyType = UIReturnKeyDone; 
    } else { 
     textField.returnKeyType = UIReturnKeyNext; 
    } 
} 
0
- (BOOL) textFieldShouldReturn:(UITextField *)textField 
{ 
    if (textField == self.textFieldName) 
    { 
     [self.textFieldName resignFirstResponder]; 
     [self.textFieldPassword becomeFirstResponder]; 
    } 
    else if (textField == self.textFieldPassword) 
    { 
     [self.textFieldPassword resignFirstResponder]; 

     [self login:self]; 
    } 

    return true; 
} 




@interface MLLoginViewController()<UITextFieldDelegate> 

@end 

@implementation MLLoginViewController 



- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.textFieldName.delegate = self; 
    self.textFieldPassword.delegate = self; 
0

Złóż zbytu dla pola tekstowego, a następnie

viewController.h

(IBAction)textFieldDoneEditing:(id)sender; 

viewController.m

(IBAction)textFieldDoneEditing:(id)sender { 
    [textField resignFirstResponder]; 
    if (textField == nameField) { 
     [emailField becomeFirstResponder]; 
    } 
} 

Bądź zależność między (pokazać inspektora Połączenia> Wysłane Wydarzenia) didEndOnExit i textFieldDoneEditing

5

Bardziej spójne i solidne sposobem jest użycie NextResponderTextField można skonfigurować to całkowicie od budowniczego interfejsu.

Wszystko, co musisz zrobić, to

  1. Ustaw typ klasy twoich UITextField być NextResponderTextField enter image description here
  2. Następnie ustaw wylot nextResponderField wskazać do następnego odpowiadającego może to być cokolwiek UITextField lub dowolnej podklasy UIResponder. Może to być również UIButton, a biblioteka jest wystarczająco inteligentna, aby wywołać zdarzenie TouchUpInside tylko wtedy, gdy jest włączone. enter image description here enter image description here

Oto biblioteka w akcji:

enter image description here

+0

Dokładnie to, czego szukam, thx! –

8

Swift wersję poprawną odpowiedź.

Z mojego doświadczenia wynika, że ​​nie trzeba rezygnować z Rezygnacji z programu ReResponder podczas przełączania pól tekstowych.

W tym przykładzie jest to tylko podstawowa nazwa użytkownika i hasło textFields.

Klawiatura "klawisz powrotu" w serii ujęć dla nazwy użytkownika jest ustawiona na "Dalej", a hasło dla hasła jest ustawione na "Gotowe".

enter image description here

Następnie wystarczy podłączyć delegatów na tych dwóch polach tekstowych i dodać to rozszerzenie i masz dość dużo zrobić.

extension LoginViewController: UITextFieldDelegate { 

    func textFieldShouldReturn(textField: UITextField) -> Bool { 
     if textField == textFieldPassword { 
      self.view.endEditing(true) 
     } else { 
      textFieldPassword.becomeFirstResponder() 
     } 
     return true 
    } 

} 
Powiązane problemy