2010-07-13 12 views
9

¿Hay un iPhone equivalente para los métodos NSResponder-selectNextKeyView o -nextValidKeyView de Mac OS X? Sé sobre el método -becomeFirstResponder, pero descubrir qué vista invocar no es muy bonito cuando las jerarquías de vista se vuelven más complicadas.Enfoque en la próxima vista de clave válida en iPhone

Debe haber algún tipo de forma de averiguar esto, ya que cuando presiono la pestaña cuando en el simulador de iPhone, el enfoque pasa correctamente al siguiente UITextField. Esto me hizo preguntarme qué sucede exactamente cuando presiono la pestaña. ¿Algunas ideas?

Actualización: Esto hace exactamente lo que quiero, pero _nextKeyResponder es API privada, por lo que no-no. ¿Hay alguna forma de hacer una tecla de tabulación 'falsa' sin usar una API privada?

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    // Try to find next responder 
    UIView *nextResponder = (UIView *)[self.view _nextKeyResponder]; 

    if (nextResponder) { 
     // Found next responder, so set it. 
     [nextResponder becomeFirstResponder]; 
     [self.tableView scrollRectToVisible:[self.tableView convertRect:[nextResponder frame] fromView:nextResponder] animated:YES]; 
    } else { 
     // Not found, so remove keyboard. 
     [textField resignFirstResponder]; 
    } 
    return NO; // We do not want UITextField to insert line-breaks. 
} 

Respuesta

11

No hay un equivalente de iOS público para NSResponder 's -selectKeyView o -nextValidKeyView.

Cuando el primer nivel de respuesta es una instancia de UITextField, pestaña presionando crea instancias de una subclase particular de UIEvent que se pasa a -[UIApplication sendEvent:], que a su vez llama a -[UIView _nextKeyResponder].

-[UIView _nextKeyResponder] no funciona de la manera que crees. Trata la cadena de vista de teclas como un bucle, por lo que nunca se alcanzará el bloque else. Por la misma razón, incluso si hubiera una API pública para sintetizar eventos de teclado, probablemente no querría usarla.

En su lugar, probablemente desee algo más como UIWebView 's UIToolbar-accesorio de entrada de formulario basado. Sus botones se pueden habilitar e inhabilitar cuando corresponda, y su delegado maneja las acciones reales de presionar un botón.

Para implementar dicho delegado de una manera general, sin embargo, podría ser útil mirar how -[UIView _nextKeyResponder] is implemented.

+0

¡Buena respuesta! Aprecio los detalles que entraste. –

0

En el UITextField delegado -textFieldDidEndEditing:, cambiar entre los diferentes campos de texto (por ejemplo, al probar la propiedad del campo de texto tag).

Cuando combina un campo de texto, establezca otro campo de texto u otro control para convertirse en el siguiente respondedor.

+1

como he escrito en mi pregunta, soy consciente de ese método. Me preguntaba si de alguna manera podría aprovechar lo que ya está en el iOS cuando maneja una pestaña. –

Cuestiones relacionadas