In iOS 5.1 e iOS 5.0 funziona, ma in iOS 6.0 la tastiera non viene visualizzata.In iOS 6, - [UITextField diventaFirstResponder] non funziona in -viewWillAppear:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
UITextField *textField = self.emailAddressTextField;
[textField becomeFirstResponder];
}
Per ora ho spostato la logica per -viewDidAppear:
.
// This works but is not desirable.
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
UITextField *textField = self.emailAddressTextField;
[textField becomeFirstResponder];
}
Questo funziona, ma non è auspicabile. L'animazione slide-up della tastiera viene visualizzata dopo il caricamento della vista.
Voglio che la tastiera sia presente mentre l'animazione da diaframma a sinistra presenta la vista caricata nel controller di navigazione.
Qualcuno sa come caricare la tastiera mentre la vista viene visualizzata in iOS 6?
aggiornamento
Sulla base del feedback @ di anatra, ho fatto un po 'di più test. Questo sembra essere specifico per UITextFields contenuto in UITableViewCells.
Qualcuno ha qualche suggerimento?
prima soluzione
Quindi una descrizione completa. Questa è una vista tabella con due celle statiche (e-mail e password). C'è un pulsante di accesso in una vista a cui è assegnata la vista del footer della tabella. Le due celle hanno un campo di testo e sono di tipo SICOTextFieldCell personalizzato.
La mia soluzione era di mettere un campo di testo falso dietro il pulsante di accesso (nella visualizzazione footer della tabella).
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
UITextField *textField = self.SICO_fakeTextField;
[textField becomeFirstResponder];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
UITextField *textField = self.SICO_emailAddressTextField;
[textField becomeFirstResponder];
}
NUOVA SOLUZIONE
Sulla base della risposta da @stm, mi si avvicinò con una nuova soluzione (superiore?).
La mia soluzione era di chiamare -selectRowAtIndexPath:animated:scrollPosition:
. -[SICOTextFieldCell setSelected:animated:]
, che è una cella di visualizzazione tabella personalizzata, chiama [self.textField becomeFirstResponder]
che disegna in modo magistrale la tastiera correttamente. È ancora un hack, ma è un trucco più pulito.
@interface SICOLogInViewController()
@property (readonly, nonatomic) UITextField *SICO_emailAddressTextField;
@property (readonly, nonatomic) UITextField *SICO_passwordTextField;
@end
@implementation SICOLogInViewController
- (IBAction)logIn
{
// Controller Details
}
#pragma mark Private
- (UITextField *)SICO_textFieldForRowAtIndexPath:(NSIndexPath *)indexPath
{
SICOTextFieldCell *cell = (SICOTextFieldCell *)[self.tableView cellForRowAtIndexPath:indexPath];
return cell.textField;
}
#pragma mark View lifecycle
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]
animated:NO scrollPosition:UITableViewScrollPositionTop];
}
#pragma mark UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
switch (textField.returnKeyType) {
case UIReturnKeyGo: [self logIn]; break;
case UIReturnKeyNext: [self.SICO_passwordTextField becomeFirstResponder]; break;
default: break;
}
return YES;
}
#pragma mark Properties
- (UITextField *)SICO_emailAddressTextField
{
return [self SICO_textFieldForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
}
- (UITextField *)SICO_passwordTextField
{
return [self SICO_textFieldForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0]];
}
@end
Hai provato mettendo quel codice in 'viewWillAppear'? –
@yulz Sì, il mio codice originale era in '-viewWillAppear:'. –
C'è qualcos'altro nel codice che lo spegne, questo dovrebbe funzionare bene. Se si desidera una soluzione rapida, chiamare [textField performSelector: @selector (becomeFirstResponder) withObject: nil afterDelay: 0.1f]; invece di [textField becomeFirstResponder] ;. Questo imposterà il primo risponditore 1/10 di un secondo più tardi, dando presumibilmente qualunque codice problematico si possa avere il tempo di finire in esecuzione e non fermarlo 1/10 di secondo dopo. Questa è una soluzione sciatta, tuttavia, non la soluzione ideale. – Anton