2012-11-20 25 views
17

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 
+0

Hai provato mettendo quel codice in 'viewWillAppear'? –

+0

@yulz Sì, il mio codice originale era in '-viewWillAppear:'. –

+1

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

risposta

5

provare a chiamare nel metodo cellForRowAtIndexPath dopo la creazione della cellula, o nel viewWillAppear del tableViewCell che contiene quel textField.

Se ciò ti dà lo stesso risultato e vuoi comunque che la tastiera appaia prima, userei un campo di testo "falso" per visualizzare la tastiera all'inizio. La mia ipotesi è che il campo di testo non sia stato aggiunto prima di viewWillAppear.

+0

I secondo la soluzione "falsa" del campo di testo. – dklt

+0

Penso che il campo di testo "falso" sia il vincitore! Grazie k20. Pubblicherò la mia soluzione tra un minuto. –

2

Ho cercato il tuo codice esattamente, iOS6 & in viewWillAppear e sembrava funzionare bene. Il tuo tentativo di avere la tastiera già visualizzata quando passi a un'altra vista sono corretto?

+0

Mi dispiace, ma non è di grande aiuto. Sottolinea che questo problema non è universale, quindi aggiornerò la mia domanda. –

-4

-viewWillAppear potrebbe non essere chiamato in iOS6? Hai provato a inserire il codice in - (void)viewWillLayoutSubviews?

+1

Posso verificare che '-viewWillAppear:' venga chiamato. –

2

Attualmente sto scrivendo il mio Input Form Kit e ho faticato per alcune ore con questo problema. Dopo aver scoperto che la mia codifica andava bene, ho trovato questa domanda indicando un possibile problema in iOS 6 e ho lavorato a una soluzione per questo.

Se si dispone (o si crea) di un UITableViewCell personalizzato, una soluzione semplice potrebbe essere la sottoclasse - (void) layoutSubviews; e controlla se UITextField della cella deve essere il primo a rispondere (ad esempio controllando se il campo di testo è uguale al campo focalizzato impostato nel delegato). In tal caso, basta chiamare - (BOOL) diventaFirstResponder; sul tuo UITextField (di nuovo).

Questo è sicuramente una soluzione migliore rispetto alla creazione di un "falso" UITextField;)

+0

Grazie per il suggerimento, ho aggiornato la mia risposta. –

Problemi correlati