Hay una manera (ya sea en IB o código) para establecer el orden de tabulación entre los campos de texto en una vista?

Nota que no estoy hablando del próximo campo de formulario después de el retorno (o «Siguiente») se pulsa el botón … muchos teclados bluetooth tienen una tecla tab, que parece ciclo a través de los campos en completamente diferente orden. En mi caso particular, esta orden no corresponde a la de los campos de la posición en la vista o incluso el orden en que los campos se han añadido. Modificar el archivo xib con la mano para cambiar el NSNextKeyView no parece hacer una diferencia, ya sea.

¿Alguien sabe cómo cambiar este orden?

  • Buena pregunta! He estado probando y parece que no hay manera de cambiar el orden; parece que el orden de tabulación es siempre de arriba a abajo, pero tal vez hay una manera oculta al sesgo de la orden.
  • Extrañamente, el orden en el que estoy experimentando NO es de arriba a abajo, aunque me gustaría que fuera. Es por eso que pedí en el primer lugar 🙂
  • Tal vez un teclado Bluetooth + física iPad funcionan de forma diferente – sólo he estado probando con el simulador y la tabulación con mi teclado de la computadora, suponiendo que sería la función de la misma (conocer el simulador, sin embargo, yo probablemente no debería haber asumido que).
InformationsquelleAutor lazycs | 2011-03-15

8 Comentarios

  1. 4

    Estoy interesado en resolver el mismo problema, aunque por el momento el orden predeterminado, que parece ser de izquierda a derecha y de arriba a abajo, es la que yo quiero.

    He probado la hipótesis de que el cursor se mueve en la profundidad de primer orden a través del árbol de subvistas y superview, pero que es no verdadero. Cambiar el orden de las subvistas sin cambiar su ubicación no cambiar el orden de los campos atravesados por ficha prensas.

    Uno posiblemente característica útil es que el campo de texto del delegado textFieldShouldBeginEditing método parece ser llamados para cada campo de texto en la ventana de la aplicación. Si NO devuelve, el campo de texto no será elegido, así que si usted puede definir su orden deseado y hacer solo el de la derecha, volver en SÍ, que podría resolver su problema.

    • Creo que esta es probablemente la mejor manera de hacerlo ya no puedo encontrar de todos modos para cambiar el orden de los predeterminada mediante la modificación del archivo xib. Lo extraño es que mi campo no ser seleccionado en la izquierda a derecha, de arriba a abajo pedido por defecto. Gracias!
    • No efecto en el comportamiento pesar de que el cambio de valor de retorno en la shoulbegin método. Si devuelve sí o no, el control de recorrer todos los campos de texto en la vista y, obviamente, las llamadas deben comenzar método cada vez pero solo campo(es decir, más cercana a la corriente de campo) se activa.
    • He construido una solución a la orden de tabulación problema basándose en esta hipótesis. Detecta y responde no sólo a las pestañas, pero también mayús+fichas para viajar hacia atrás.
  2. 8

    @corona respuesta fue sólo algo útil. Sólo porque algo funciona fuera de la caja no significa que usted debe dejar de pensar en una mejor manera, o incluso el camino correcto — de hacer algo. Como notó el comportamiento es indocumentados, pero se adapta a nuestras necesidades, la mayoría del tiempo.

    Esto no era suficiente para mí, sin embargo. Pensar en un lenguaje RTL y fichas seguiría ficha de izquierda a derecha, por no mencionar el comportamiento es totalmente diferente de simulador para dispositivo (el dispositivo no se centra en la primera entrada sobre la ficha). Lo más importante es que a pesar de que, de Apple indocumentados parece que la aplicación sólo se consideren las opiniones instalado actualmente en la vista de jerarquía.

    Pensar en un formulario en forma de (ningún retruécano previsto) una vista de tabla. Cada celda tiene un único control, por lo tanto no todos los elementos de formulario pueden ser visibles al mismo tiempo. Apple acaba de ciclo de copia de seguridad una vez que llegó a la última (en la pantalla!) control, en lugar de desplazamiento de más abajo. Este comportamiento es definitivamente no es lo que deseo.

    Así que aquí está lo que yo he venido para arriba con. El formulario debe ser gestionado por un controlador de vista, y a la vista de los controladores son parte del respondedor de la cadena. Así que eres perfectamente libre para poner en práctica los métodos siguientes:

    #pragma mark - Key Commands
    - (NSArray *)keyCommands
    {
    static NSArray *commands;
    static dispatch_once_t once;
    dispatch_once(&once, ^{
    UIKeyCommand *const forward = [UIKeyCommand keyCommandWithInput:@"\t" modifierFlags:0 action:@selector(tabForward:)];
    UIKeyCommand *const backward = [UIKeyCommand keyCommandWithInput:@"\t" modifierFlags:UIKeyModifierShift action:@selector(tabBackward:)];
    commands = @[forward, backward];
    });
    return commands;
    }
    - (void)tabForward:(UIKeyCommand *)command
    {
    NSArray *const controls = self.controls;
    UIResponder *firstResponder = nil;
    for (UIResponder *const responder in controls) {
    if (firstResponder != nil && responder.canBecomeFirstResponder) {
    [responder becomeFirstResponder]; return;
    }
    else if (responder.isFirstResponder) {
    firstResponder = responder;
    }
    }
    [controls.firstObject becomeFirstResponder];
    }
    - (void)tabBackward:(UIKeyCommand *)command
    {
    NSArray *const controls = self.controls;
    UIResponder *firstResponder = nil;
    for (UIResponder *const responder in controls.reverseObjectEnumerator) {
    if (firstResponder != nil && responder.canBecomeFirstResponder) {
    [responder becomeFirstResponder]; return;
    }
    else if (responder.isFirstResponder) {
    firstResponder = responder;
    }
    }
    [controls.lastObject becomeFirstResponder];
    }

    Lógica adicional para el desplazamiento fuera de la pantalla socorristas visible de antemano pueden aplicar.

    Otra ventaja de este enfoque es que usted no necesita subclase todo tipo de controles es posible que desee mostrar (como UITextFields) pero en su lugar puede manejar la lógica del controlador de nivel, en el que, seamos honestos, es el lugar correcto para hacerlo.

    • He tratado de aplicar este método, pero yo no soy capaz de llamar a sí mismo.los controles; he tratado de llamar a él en la celda así como en el controlador de vista. Puede usted por favor me guía. Gracias de antemano.
    • Es obvio que tiene que implementar un método para devolver el control que desea ficha de alrededor de…
    • Si es posible, puede usted por favor me dan el ejemplo y la actualización de su respuesta en consecuencia.
    • Mi ejemplo es bastante claro. Acaba de anular la función de captador para -controls y devolver lo controles que desea recorrer.
    • ESTO es la respuesta real del siglo 21. Los otros son hacks para matar el tiempo y código.
    • Gracias, hombre!

  3. 3

    La tecla Tab comportamiento en ios será como sigue:-
    cuando u pulse la tecla tab en el teclado externo – el control atraviesa todos los campos de texto en la pantalla llamando solo shouldBeginEditing método en el que su valor de retorno es también determinado por Apple, lo cual no se puede anular.
    Después de escanear todos los campos en los que se calcula más cercano x posicionado Textfield relativa al desplazamiento de vista de la corriente de campo de texto y, a continuación, más cercano Y Posicionado en el Campo.

    También no se puede hacer nada hasta que el control viene a textFieldDidBeginEditing método.

    Razón para apple restricción podría ser permitir a los desarrolladores a seguir las directrices de interfaz de usuario donde el próximo respondedor de campo debe ser lo más cercano posicionado en el Campo en lugar de cualquier otro campo .

  4. 2

    Registrar un UIKeyCommand para detectar la ficha de tecla presionada. Hice esto en mi actual controlador de vista.

        self.addKeyCommand(UIKeyCommand(input: "\t", modifierFlags: [], action: #selector(tabKeyPressed)))

    Dentro de la clave tabKeyPressed controlador de encontrar su actual campo activo, a continuación, establezca su próxima respuesta. orderedTextFields es una matriz de UITextField en el orden de tabulación quiero.

    func tabKeyPressed(){
    let activeField = getActiveField()
    if(activeField == nil){
    return
    }
    let nextResponder = getNextTextField(activeField!)
    nextResponder?.becomeFirstResponder()
    }
    func getActiveField() -> UITextField? {
    for textField in orderedTextFields {
    if(textField.isFirstResponder()){
    return textField
    }
    }
    return nil
    }
    func getNextTextField(current: UITextField) -> UITextField? {
    let index = orderedTextField.indexOf(current)
    if(orderedTextField.count-1 <= index!){
    return nil
    }
    return orderedTextField[index! + 1]
    }
  5. 0

    Usted puede hacerlo mediante la configuración de la etiqueta de cada campo de texto y el manejo de esta en el textfieldShouldReturn método.

    Ver esta publicación de blog sobre esto:
    http://iphoneincubator.com/blog/windows-views/how-to-create-a-data-entry-screen

    • Gracias por la idea, pero que sólo implementa lo que ya tengo: la capacidad para seleccionar el siguiente campo cuando un usuario pulsa la tecla de retorno. Lo que estoy buscando es una manera de seleccionar el siguiente campo en un de la ficha pulse en un medio físico (por ejemplo, el diente azul) del teclado. La configuración de la etiqueta no tiene nada que ver con el orden de tabulación tan lejos como iOS es que se trate; la entrada en el blog, simplemente lo utiliza como una manera conveniente de acceder a la siguiente campo de texto en los métodos de delegado (que se llama sólo cuando el regresar se pulsa la tecla).
  6. 0

    La única forma que he encontrado para poder detectar una pulsación de tecla Tab desde un teclado físico, es la aplicación de la UIKeyInput del protocolo de insertText: método en un objeto personalizado que canBecomeFirstResponder.

    - (void)insertText:(NSString *)text {
    NSLog(@"text is equal to tab character: %i", [text isEqualToString:@"\t"]);
    }

    Yo no conseguir que esto funcione, mientras que la creación de subclases UITextField, por desgracia, como UITextField que no permiten la insertText: método de protocolo que se llama.

    Podría ayudarle en el camino, aunque..

    • Tabulación entre los campos de texto es manejado automáticamente por iOS… yo realmente no necesita para detectar la pulsación de tecla tab manualmente; yo sólo quiero ser capaz de establecer el elemento que debe convertirse en la primera respuesta después de otro dimite como primer respondedor automáticamente en respuesta a la tecla tab.
    • Lo sé, lo estoy tratando de hacer es examinar la posibilidad de detectar las pulsaciones de teclado de la Ficha de ti mismo y combinar esto con una matriz que contiene el orden de los campos de entrada, por ejemplo. En otras palabras; la sustitución de la de iOS comportamiento cuando se trata de la tabulación.
  7. 0

    Lo resuelto por la creación de subclases UITextField como NextableTextField. Que la subclase tiene una propiedad de clase UITextField con IBOutlet un circuito.

    Construir la interfaz de IB. Establecer la clase de su campo de texto para NextableTextField. Utilice el Inspector de conexiones para arrastrar una conexión a la ‘siguiente’ campo que desea ficha a.

    En el campo de texto de delegado de clase, agregue este método delegado…

    - (BOOL)textFieldShouldReturn:(UITextField *) textField
    {
    BOOL didResign = [textField resignFirstResponder];
    if (!didResign) return NO;
    if ([textField isKindOfClass:[NextableTextField class]])
    dispatch_async(dispatch_get_current_queue(), ^{ [[(NextableTextField *)textField nextField] becomeFirstResponder]; });
    return YES;
    }

    Por CIERTO – no he venido para arriba con esto; sólo recuerdo haber visto la idea de alguien.

    • No creo que esto va a funcionar por sí mismo, porque textFieldShouldReturn: no se llama cuando se presiona la tecla tab.

Dejar respuesta

Please enter your comment!
Please enter your name here