xamarin.ios - MonoTouch.Dialog: descarte el teclado tocando en cualquier parte en DialogViewController
(4)
Descubrí una solución que me satisface lo suficiente, así que estoy respondiendo 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 descartará el teclado siempre que el usuario arrastre la vista un poco. No hay eventos táctiles que pueda encontrar asociados con la vista de tabla, por lo que esta es la mejor opción. Me gustaría cualquier otra idea. ¡Aclamaciones!
NOTA: Hay dos preguntas de SO similares (1) (2) , pero ninguna de ellas proporciona una respuesta.
TL; DR: ¿Cómo se puede descartar el teclado en un MonoTouch.Dialog dejando 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" ...
Cuando el usuario comienza a escribir, el teclado obstruye la barra de pestañas ...
Usando MonoTouch.Dialog, la única forma de descartar 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 desaparezca, me gustaría una mejor manera de hacerlo. Es decir, para descartar si el usuario toca en cualquier otro lugar de la pantalla.
Sin MonoTouch.Dialog, es muy fácil: simplemente invalide TouchesBegan y llame a EndEditing. Pero esto no funciona con MT.D. He intentado subclasificar DialogViewController y reemplazar TouchesBegan allí, pero no funciona. Actualmente estoy en una pérdida.
O, me pregunto, ¿estaría mejor abandonando la barra de pestañas para poder usar un UINavigationController con un botón "Atrás" en la parte superior, que no estará oculto por el teclado?
Le sugiero que utilice un reconocedor de gestos de toque que no causará interferencia con los controladores de eventos TableView:
var tap = new UITapGestureRecognizer ();
tap.AddTarget (() => dvc.View.EndEditing (true));
dvc.View.AddGestureRecognizer (tap);
tap.CancelsTouchesInView = false;
También te perdiste mi pregunta al respecto: ¿Se puede descartar el teclado tocando fuera de la celda en MonoTouch.Dialog? :-)
Esta es mi solicitud de función # 1 para MonoTouch.Dialog.
Para responder a su pregunta: No. No es posible. He buscado y preguntado alrededor y no he encontrado ninguna respuesta.
Supongo que porque es solo una tabla seccionada (agrupada) y si no estuviera seccionada, no habría ningún lugar para hacer clic. Sin embargo, eso es sólo mi especulación.
Deseo que miguel o alguien que trabaje en monotouch responda esto y diga si es posible. Posiblemente una mejora futura?
Una solución alternativa para usar el gesto de arrastrar en lugar del toque según lo propuesto (que no interfiere con los gestos de la vista de tabla) es anular MonoTouch.Dialog.DialogViewController.SizingSource (o MonoTouch.Dialog.DialogViewController.Source si no desea uneven filas) y dárselo al 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);
}
}
}