2013-07-22 12 views
7

Nie mogłem znaleźć niczego w dokumentacji Xamarin o przejściu do następnego pola tekstowego w serii pól tekstowych w formularzu, tylko mały samouczek dotyczący usuwania klawiatury.Xamarin iOS - Przejdź do następnego pola tekstowego z kluczem powrotu

Aby wszystko było proste, używam pola tekstowego txtUsername (tag 1) i pola tekstowego txtPassword (tag2). Kiedy zaimplementuję poniższy kod, nie przenosi się do Xamarin Studio. Czy ktoś wie, w jaki sposób można to zrobić kod w Xamarin Studio, lub alternatywnie, czy mogę przenieść kod z XCode do Xamarin Studio.

używam następujący kod:

- (BOOL)textFieldShouldReturn:(UITextField *)txtUsername{ 
    NSLog(@"textFieldShouldReturn:"); 
    if (txtUsername.tag == 1) { 
     UITextField *txtPassword= (UITextField *)[self.view viewWithTag:2]; 
     [txtPassword becomeFirstResponder]; 
    } 
    else { 
     [txtUsername resignFirstResponder]; 
    } 
    return YES; 
} 

góry dzięki

Odpowiedz

2

Można skorzystać z tych funkcji

http://iosapi.xamarin.com/?link=M%3aMonoTouch.UIKit.UIResponder.BecomeFirstResponder

BecomeFirstResponder() 

i

http://iosapi.xamarin.com/?link=M%3aMonoTouch.UIKit.UIResponder.ResignFirstResponder

ResignFirstResponder() 

Zgodnie z dokumentacją należy dodać metodę textField Delegowanie jak ten

public virtual bool ShouldReturn (UITextField textField) 
{ 

    if (txtUsername.tag == 1) { 

    UITextField txtPassword = (UITextField)this.view.ViewWithTag(2); 

    txtPassword.BecomeFirstResponder(); 
    } 
    else { 
    txtUsername.ResignFirstResponder(); 
     } 
return true; 
} 
+0

Ach tak, nie sądziłem, że zajrzę do dokumentacji API, zajrzałem do Przewodników i Samouczków. Jeśli możesz dać mi znać, jak się na tym świetnie, jestem nowy w Xamarin i XCode, ale będę musiał je wdrożyć, kiedy wrócę do domu później. –

+0

Wypróbuj powyższą implementację, nie jestem pewien, czy to zadziała! – satheeshwaran

+0

Dziękuję bardzo, właśnie przetestowałem tę metodę i działa idealnie! –

2

Oto próbka tego, jak wdrożyć w Xamarin.iOS. Mogą istnieć inne prostsze sposoby na zrobienie tego, ale nie mogłem znaleźć żadnego, a to działa dla mnie.

Podklasyfikowałem UITextFieldDelegate, aby dodać niestandardową procedurę obsługi zdarzenia, a następnie utworzyłem jej instancję w moim kodzie kontrolera widoku, przypisałem wyrażenie lambda do niestandardowej procedury obsługi zdarzeń, aby uzyskać dostęp do zmiennych instancji i ustawić tę delegowaną instancję jako Delegat na moich polach 2 ext

public class LoginTextFieldDelegate : UITextFieldDelegate 
    { 
     public EventHandler<UITextField> OnShouldReturn; 

     public override bool ShouldReturn(UITextField textField) 
     { 
      if (OnShouldReturn != null) 
      { 
       OnShouldReturn(this, textField); 
      } 

      return true; 
     } 
    } 

Wtedy moim zdaniem metody kontroler viewDidLoad:

var textDelegate = new LoginTextFieldDelegate 
    { 
     OnShouldReturn = (sender, textField) => 
     { 
      if (textField.Tag == txtEmailAddress.Tag) 
      { 
       txtPassword.BecomeFirstResponder(); 
      } 
      else if (textField.Tag == txtPassword.Tag) 
      { 
       txtPassword.ResignFirstResponder(); 
      } 
     } 
    }; 

    txtEmailAddress.Delegate = textDelegate; 
    txtPassword.Delegate = textDelegate; 

nie zapomnij ustawić odrębny tag na każdej UITextField w/kod interfejsu Builder!

2

Napisałem ogólne rozwiązanie dla każdej formy (nie tylko dla tych z 2 polami).

Ive got BaseViewController z tych metod:

private UITextField[] formTextfields; 
protected void EnableNextKeyForTextFields(UITextField[] fields) 
    { 
     formTextfields = fields; 

     foreach (var field in fields) 
     { 
      field.ShouldReturn += ShouldReturn; 
     } 
    } 

    private bool ShouldReturn(UITextField textField) 
    { 
     int index = Array.IndexOf(formTextfields, textField); 

     if (index > -1 && index < formTextfields.Length - 1) 
     { 
      formTextfields[index + 1].BecomeFirstResponder(); 
      return true; 
     } 
     else if (index == formTextfields.Length - 1) 
     { 
      formTextfields[index].ResignFirstResponder(); 
      FormFinished(); 
     } 

     return false; 
    } 

    protected virtual void FormFinished() 
    { 
     // this should be implemented on viewControllers using "EnableNextKeyForTextFields" 
    } 

Następnie w implementacji widoku, po prostu trzeba przejść wszystkie swoje pól tekstowych w jednej tablicy:

EnableNextKeyForTextFields(new UITextField[] { NameField, SurnameField, EmailField, PasswordField }); 

Kiedy użytkownicy klikają "return" podczas edycji ostatniego pola tablicy, zostanie wywołana metoda "FormFinished", więc można ją zastąpić w swojej implementacji:

protected override void FormFinished() 
{ 
    (ViewModel as RegisterViewModel).Register(); // or whatever you need to do here 
} 

Mam nadzieję, że jest to przydatne dla kogoś

0

może być łatwiejsze w użyciu klasę dostępną here

public override void ViewDidLoad() 
{ 
    base.ViewDidLoad(); 

    // Manage keyboard and tab order 
    new [] { 
     usernameField, // Tab order = 0 
     passwordField, // Tab order = 1 
     emailField // Tab order = 2 
    }.InitializeNavigationOnFields(); 
} 

Wystarczy wywołać metodę przechodzącą wszystkich pól tekstowych w celu chcesz je można nawigować poprzez klawiatura.

6

Myślę, że najprostszym sposobem na to jest użycie metody ShouldReturn na twoich UITextFields za pomocą metody BecomeFirstResponder. Na przykład, dla formularza logowania z login i hasło UITextFields, w następujący sposób (w metodzie viewDidLoad):

Username = new UITextField(); 
Username.ReturnKeyType = UIReturnKeyType.Next; 
Username.KeyboardType = UIKeyboardType.EmailAddress; 
Username.ShouldReturn = (tf) => 
    { 
     Password.BecomeFirstResponder(); 
     return true; 
    }; 
View.Add(Username); 

Password = new UITextField(); 
Password.SecureTextEntry = true; 
Password.ReturnKeyType = UIReturnKeyType.Go; 
Password.ShouldReturn = (tf) => 
    { 
     // Do your login 
     return true; 
    }; 
View.Add(Password); 

Po kliknięciu przycisku Dalej, gdy Użytkownik jest aktywny, to przesuwa się w polu Hasło. Kliknięcie Go w polu hasła przesyła formularz.

Powiązane problemy