2012-05-30 22 views
16

NOTA: Hay dos preguntas similares SO (1)(2), pero ninguno de ellos proporciona una respuesta.MonoTouch.Dialog: Descartando teclado tocando en cualquier parte DialogViewController

TL; DR: ¿Cómo se puede descartar el teclado en un MonoTouch.Dialog al permitir que el usuario toque cualquier espacio vacío en la vista?

Estoy escribiendo una aplicación usando MonoTouch.Dialog y un UITabBarController. Una de mis pestañas es "Configuración" ...

Settings screen

Cuando el usuario comienza a escribir, el teclado obstruye la barra de pestañas ...

enter image description here

Uso MonoTouch.Dialog, el único La forma de cerrar el teclado es ir al último campo y presionar la tecla "regresar". Teniendo en cuenta el hecho de que el usuario no puede presionar ninguna pestaña hasta que el teclado se haya ido, me gustaría una mejor manera de hacerlo. A saber, para descartar si el usuario toca en cualquier otro lugar en la pantalla.

Sin MonoTouch.Dialog, es muy fácil: simplemente anular touchesBegan y llame EndEditing. Pero esto no funciona con MT.D. Intenté crear una subclase de DialogViewController y sustituir ToquesBegan allí, pero no funciona. Actualmente estoy perdido.

O, me pregunto, ¿sería mejor que abandone la tabbar para poder usar un UINavigationController con un botón "Atrás" en la parte superior, que no se ocultará por el teclado?

Respuesta

30

le sugiero que utilice un reconocedor del grifo gesto que no cause interferencia con los controladores de eventos TableView:

var tap = new UITapGestureRecognizer(); 
tap.AddTarget (() => dvc.View.EndEditing (true)); 
dvc.View.AddGestureRecognizer (tap); 
tap.CancelsTouchesInView = false; 
+0

Eso es brillante. Después de leer su respuesta a http://stackoverflow.com/questions/10832014/using-decelerationended-interferes-with-other-callbacks, me di cuenta de que mi solución probablemente causaría problemas en el futuro. No solo es mejor el tuyo, ya que elimina esa posibilidad, sino que también proporciona la funcionalidad exacta que estaba buscando. ¡Un millón de gracias! –

+3

también debe agregar dvc.CancelsTouchesInView = false; De lo contrario, esto cancelará todos sus otros clics en la página. – benpage

+13

agregar tap.CancelsTouchesInView = false; para evitar que TapGestureRecognizer se cancele haciendo clic en todos los elementos. –

2

se ha perdido mi pregunta al respecto también: Can the keyboard be dismissed by touching outside of the cell in MonoTouch.Dialog? :-)

Ésta es mi # 1 solicitud de función para MonoTouch.Dialog.

Para responder a su pregunta: No. No es posible. He buscado y preguntado y no he encontrado ninguna respuesta.

supongo que porque es sólo una mesa seccionado (agrupadas) y si no se seccionó, no habría ningún lugar para hacer clic. Sin embargo, esa es solo mi especulación.

Me gustaría que Miguel o alguien que trabaja en MonoTouch respondería a esto y decir si es aún posible. Posiblemente una mejora futura?

+0

Oh, sí, recuerdo haber leído su pregunta, lo siento. Es una pena sobre este tema: de lo contrario, MT.D es un paquete brillante. Esperaré por un tiempo, por si alguna otra persona pudiera tener una respuesta. Si no, aceptaré los tuyos. –

+0

para mí también. No parece ser difícil de implementar. – nicolas

1

me di cuenta de una solución que satisfaga lo suficientemente bien, así que estoy respondiendo a mi propia pregunta.

// I already had this code to set up the dialog view controller. 
var bc = new BindingContext (this, settings, "Settings"); 
var dvc = new DialogViewController (bc.Root, false); 

// **** ADD THIS **** 
dvc.TableView.DraggingStarted += (sender, e) => { 
    dvc.View.EndEditing (true); 
}; 

Esto ignorará el teclado cuando el usuario arrastra la vista un poco. No hay ningún evento táctil que pueda encontrar asociado a la vista de tabla, por lo que esta es la mejor opción. Agradecería cualquier otra idea. ¡Aclamaciones!

+1

Lo anterior interferirá con otros eventos de TableView, use el reconocedor de gestos, como muestro en mi respuesta en esta pregunta. –

0

Una solución alternativa para utilizar el gesto de arrastrar en lugar de la llave como se propone (que no interfiera con la gestos de vista de tabla) es anular MonoTouch.Dialog.DialogViewController.SizingSource (o MonoTouch.Dialog.DialogViewController.Source si no desea filas irregulares) y se lo da a DialogViewController. No sé si es muy limpio o seguro.

public class CustomTableViewSource : MonoTouch.Dialog.DialogViewController.SizingSource 
{ 
public CustomTableViewSource(MonoTouch.Dialog.DialogViewController dvc) : base(dvc) 
{ 

} 

public override void DraggingStarted(UIScrollView scrollView) 
{ 
    base.DraggingStarted(scrollView); 

    if (scrollView != null) 
    { 
    scrollView.EndEditing(true); 
    } 
} 

}

Cuestiones relacionadas