2010-10-15 2 views
13

Quando si utilizza una tastiera hardware con iOS, premendo tab o shift-tab si passa automaticamente al risponditore logico successivo o precedente, rispettivamente. C'è un modo per fare lo stesso programmaticamente (cioè simulare il tasto tab invece di tenere traccia dell'ordine logico manualmente)?Simula tasto Tab Premere in iOS SDK

+6

duplicati di domanda: http://stackoverflow.com/questions/3241966/ focus-on-next-valid-key-view-on-iphone che ha ottenuto un'ottima risposta. –

risposta

0

Non è sicuro se questo aiuti, ma nel contesto di un UITextFields, se si implementa UITextFieldDelegate, - (BOOL)textFieldShouldReturn:(UITextField *)textField verrà chiamato quando si preme il tasto di ritorno della tastiera virtuale.

Ho provato a colpire direttamente sulla tastiera del mio portatile e sembrava saltare tra tutti i campi di testo nell'ordine in cui li hai aggiunti alla vista, ma non sono passati ad altri tipi di campi (Pulsanti ecc.).

Il tasto sulla tastiera simula il tasto sulla tastiera virtuale del simulatore, che funziona come previsto.

3

È possibile definire "ordine di tabulazione" utilizzando la proprietà di tag. Il seguente post descrive come trovare il prossimo indice di tag per andare a per UITextField s, How to navigate through textfields (Next/Done Buttons).

Ecco una versione modificata del codice di quel post. Invece di rimuovere la tastiera dall'ultimo indice di tag, questo codice seguente cercherebbe di tornare al primo indice di tag.

-(BOOL)textFieldShouldReturn:(UITextField*)textField; 
{ 
    NSInteger nextTag = textField.tag + 1; 
    // Try to find next responder 
    UIResponder* nextResponder = [textField.superview viewWithTag:nextTag]; 
    if (nextResponder) { 
    // Found next responder, so set it. 
    [nextResponder becomeFirstResponder]; 

    return NO; 
    } 

    // Try to find the first responder instead... 
    // Assuming the first tag index is 1 
    UIResponder* firstResponder = [textField.superview viewWithTag:1]; 
    if (firstResponder) { 
    // loop back to the first responder 
    [firstResponder becomeFirstResponder]; 
    } else { 
    // Not found, so remove keyboard. 
    [textField resignFirstResponder]; 
    } 

    return NO; // We do not want UITextField to insert line-breaks. 
} 

Se si desidera un elemento dell'interfaccia utente diverso UITextField, si dovrebbe comunque essere in grado di usare la stessa logica, con un paio di assegni.

8

As William Niu ha ragione, ma è anche possibile utilizzare questo codice spiegato di seguito.

Ho usato questo e ottenuto success.Now considerare l'esempio di UITextField ...

È possibile utilizzare metodo delegato di UITextView -(BOOL)textFieldShouldReturn:(UITextField*)textField come spiegato di seguito.

Ma prima di fare questo dovresti dare un tag a ogni UITextField in un ordine di incremento ... (L'ordine di incremento non è necessario, ma come per il mio codice è richiesto, puoi anche usare l'ordine di decremento ma qualche codice cambiamenti per fare questo)

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

    NSInteger nextTag = textField.tag + 1; 
    UIResponder* nextResponder = [self.view viewWithTag:nextTag]; 
    if (nextResponder) { 
     [nextResponder becomeFirstResponder];  
    } else { 
     [textField resignFirstResponder]; 
    } 
    return YES; 
} 

Spero che questo funzionerà per voi ...

felice di codifica ....

+0

Funziona con campi di testo statici, ed è in realtà un ottimo approccio, ma tutto si riduce se i campi di testo sono in tabelle di riferimento riutilizzabili. – n00neimp0rtant