2013-07-22 9 views
7

Non sono riuscito a trovare nulla nella documentazione di Xamarin sulla navigazione nel campo di testo successivo in una serie di campi di testo in un modulo, solo un piccolo tutorial sulla rimozione della tastiera.Xamarin iOS - Passare al campo di testo successivo con tasto di ritorno

Per mantenere le cose semplici Sto usando un (tag 1) campo di testo txtUsername e un campo di testo txtPassword (tag 2). Quando implemento il codice seguente, non viene trasferito a Xamarin Studio. Qualcuno sa come questo può essere fatto codice in Xamarin Studio, o in alternativa se posso trasferire il codice da XCode a Xamarin Studio.

Sto usando il seguente codice:

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

Grazie in anticipo

risposta

2

Si potrebbe fare uso di queste funzioni

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

BecomeFirstResponder() 

e

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

ResignFirstResponder() 

Secondo la documentazione si dovrebbe aggiungere il metodo textField delegato come questo

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

Ah sì, non ho pensato di dare un'occhiata alla documentazione dell'API, ho cercato nelle Guide e nei Tutorials. Se riesci a farmi sapere come andrai, sarebbe fantastico, sono nuovo di Xamarin e XCode, ma mi occuperò di implementarli quando torno a casa. –

+0

Prova l'implementazione di cui sopra, non sono sicuro che funzionerebbe! – satheeshwaran

+0

Grazie mille, ho appena testato questo metodo e funziona perfettamente! –

2

Ecco un esempio di come implementare in Xamarin.iOS. Potrebbero esserci altri modi più semplici per farlo, ma non ne ho trovato nessuno, e questo funziona per me.

I sottoclasse UITextFieldDelegate per aggiungere un gestore di eventi personalizzato, quindi creato un'istanza di esso nel mio codice del controller di visualizzazione, assegnato un'espressione lambda al gestore di eventi personalizzato in modo da poter accedere alle variabili di istanza e impostare questa istanza delegato come delegato su miei campi 2 ext:

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

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

      return true; 
     } 
    } 

Poi a mio avviso, il metodo di controllo 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; 

non dimenticare di impostare un tag distinti su ogni UITextField nel codice/Interface Builder!

2

Ho scritto una soluzione generica per ogni modulo (non solo quelli con 2 campi).

Ive ha ottenuto un BaseViewController con questi metodi:

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" 
    } 

Poi, nell'implementazione vista, è solo bisogno di passare tutti i vostri campi di testo in un singolo array:

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

Quando il utenti click "ritorno" quando si modifica l'ultimo campo della matrice, il metodo del "FormFinished" sarà chiamato, in modo da poter ignorare che nell'implementazione:

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

Spero che questo sia utile per qualcuno

0

potrebbe essere più semplice utilizzare la classe disponibile 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(); 
} 

Basta chiamare il metodo passando tutti i campi di testo nell'ordine in cui si desidera loro di essere navigato attraverso il tastiera.

6

Penso che il modo più semplice per farlo è utilizzare il metodo ShouldReturn sul tuo UITextFields con il metodo BecomeFirstResponder. Ad esempio, per un form di login con username e password UITextFields, come segue (nel metodo 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); 

Quando si fa clic successivo quando il nome utente è attivo, si muove verso il campo Password. Facendo clic su Vai nel campo della password viene inviato il modulo.

Problemi correlati