2012-03-02 15 views
40

Ho una scena semplice (usando lo storyboard in IB) con una casella di testo Username e Password. Ho impostato la tastiera per chiudere quando ci si trova nel campo di testo Password, ma non è possibile ottenere il pulsante successivo (ritorno) per lavorare su Nome utente per passare il focus (o Primo risponditore) alla casella di testo Password.L'app per iOS "next" non andrà al campo di testo successivo

sto chiudendo la tastiera mentre sul campo di testo Password come questo:

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { 
if (theTextField == self.textPassword) { 
    [theTextField resignFirstResponder]; 
} 
return YES; 
} 

So che è qualcosa di simile a questo, ma solo non può inchiodare giù.

+0

aggiungere seguito biblioteca e questo è tutto https://github.com/hackiftekhar/IQKeyboardManager –

risposta

87

La chiave di ritorno non esegue nulla di speciale in un campo di testo per impostazione predefinita. È necessario modificare esplicitamente il primo soccorritore:

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { 
    if (theTextField == self.textPassword) { 
     [theTextField resignFirstResponder]; 
    } else if (theTextField == self.textUsername) { 
     [self.textPassword becomeFirstResponder]; 
    } 
    return YES; 
} 
+1

Questo metodo viene mai chiamato quando si preme il ritorno pulsante ... –

+0

Puoi condividere lo stesso per swift? – Uday

+1

@ RaphaelRoyer-Rivard è necessario impostare la 'delegate' del' UITextField' al viewcontroller (o qualunque classe di questo codice viene aggiunto) – vrwim

3

Ecco cosa si dovrebbe mettere: esistono

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { 
    if (theTextField == self.textPassword) { 
     [theTextField resignFirstResponder]; 
    } else if (theTextField == self.usernameField) { 
     [self.textPassword becomeFirstResponder]; 
    } 
return YES; 
} 
38

Io uso questo codice che mi permette di controllare il comportamento del modulo nella storyboard:

-(BOOL) textFieldShouldReturn:(UITextField *)textField{ 
    if(textField.returnKeyType==UIReturnKeyNext) { 
     UIView *next = [[textField superview] viewWithTag:textField.tag+1]; 
     [next becomeFirstResponder]; 
    } else if (textField.returnKeyType==UIReturnKeyDone) { 
     [textField resignFirstResponder]; 
    } 
    return YES; 
} 

Tutto ciò che serve è quello di assegnare il valore ordine come tag, e returnkey secondo il successivo o Fatto su ciascun controllo di input.

+3

La migliore risposta di tutti !! –

+0

Quindi come impostare i tag per i campi di testo? – setherj

+2

È semplice come esempioField.tag = 1; ? – setherj

9

È necessario aggiungere UITextFieldDelegate nel file di intestazione. allora dovete impostare

theTextField.delegate = self; 

nel viewDidLoad-metodo. Dopo di che si può andare avanti con

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { 
    if (theTextField == self.textPassword) { 
     [theTextField resignFirstResponder]; 
    } else if (theTextField == self.textUsername) { 
     [self.textPassword becomeFirstResponder]; 
    } 
    return YES; 
} 
11

per coloro che vogliono usare la lingua Swift:

class MyClass: UIViewController, UITextFieldDelegate { 

@IBOutlet weak var text1: UITextField! 
@IBOutlet weak var text2: UITextField! 
@IBOutlet weak var text3: UITextField! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    text1.delegate = self 
    text2.delegate = self 
    text3.delegate = self 


} 

//.... 

func textFieldShouldReturn(textField: UITextField) -> Bool{ 
    if textField == self.text1 { 
     self.text2.becomeFirstResponder() 
    }else if textField == self.text2{ 
     self.text3.becomeFirstResponder() 
    }else{ 
     self.text1.becomeFirstResponder() 
    } 
    return true 
} 

//... 

}

:-)

0

È possibile utilizzare questa sottoclasse di UITextField che modificano dinamicamente UIReturnKey in base alle condizioni testo/stringa e quindi eseguono l'azione di continuazione in textFieldShouldReturn: (UITextField *) textField delegate

0

Ho riscontrato un problema in cui il campo di testo della password viene attivato e quindi si perde immediatamente lo stato attivo. Alla fine ho scoperto che sarebbe meglio restituire NO in function textFieldShouldReturn :. Se restituiamo SÌ, il campo di testo otterrà un insertText: call. Quindi perderà la messa a fuoco. Non so il motivo.

ho creato una nuova domanda per questo problema: UITextField get focus and then lose focus immediately due to return YES in textFieldShouldReturn

Se qualcuno conosce la ragione, fatemelo sapere. Grazie.

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { 
    if (theTextField == self.textPassword) { 
     [theTextField resignFirstResponder]; 
    } else if (theTextField == self.textUsername) { 
     [self.textPassword becomeFirstResponder]; 
    } 
    // we'd better return NO here 
    return NO; 
} 
-1

Ho provato ad usare la risposta di Esteve ma non funziona. Forse perché sto usando i file xib. Quello che ho fatto è cambiare il suo codice per farlo funzionare nel mio codice.

Funziona allo stesso modo. Tutto ciò che serve è assegnare il valore dell'ordine come tag e restituire la chiave in base a Avanti o Fatto o Invia su ciascun controllo di input.

- (BOOL)textFieldShouldReturn:(UITextField *)textField{ 

    [textField resignFirstResponder]; 

    if(textField.returnKeyType==UIReturnKeyNext) { 

     UITextField *next = (UITextField *)[self.view viewWithTag:textField.tag+1]; 
     [next becomeFirstResponder]; 

    } else if (textField.returnKeyType==UIReturnKeySend) { 

     //Do whatever you want with the last TextField 
    } 

    return YES; 
} 
+0

Questo in realtà non risponde alla domanda. Se hai una domanda diversa, puoi richiederla facendo clic su [Invia domanda] (http://stackoverflow.com/questions/ask). Puoi anche [aggiungere una taglia] (http://stackoverflow.com/help/privileges/set-bounties) per attirare maggiormente l'attenzione su questa domanda una volta che hai abbastanza [reputazione] (http://stackoverflow.com/help/ che cosa è-la reputazione). - [Dalla revisione] (/ recensione/post di bassa qualità/11128083) – Stefan

+0

se UserName ha tag impostato su 1 e restituisce chiave "UIReturnKeyNext" e Password ha tag impostato su 2 e restituisce chiave su "UIReturnKeySend" o "UIReturnKeyDone" , il codice risolve il problema, almeno in un file xib. Perché questo non risponde alla domanda? I miei campi di testo sono: - Nome - Cognome - Email - password -Re-Tipo di password. e i codici funzionano perfettamente. –

0

Ecco una Swift 2.0 Versione di Rob Mayoff

func textFieldShouldReturn(textField: UITextField) -> Bool { 
    if textField == self.emailTextField { 
     self.passwordTextField.becomeFirstResponder() 
    }else{ 
     self.passwordTextField.resignFirstResponder() 
    } 
    return false 
}