MonoTouch.Dialog:通过触摸DialogViewController中的任何位置来解除键盘

时间:2012-05-30 20:53:08

标签: xamarin.ios monotouch.dialog

注意:有两个类似的SO问题 (1) (2) ,但它们都没有提供答案。

TL; DR:如何通过让用户触摸视图中的任何空白区域来解除MonoTouch.Dialog中的键盘?

我正在使用MonoTouch.Dialog和UITabBarController编写应用程序。我的一个标签是“设置”......

Settings screen

当用户开始输入时,键盘会阻碍标签栏...

enter image description here

使用MonoTouch.Dialog,解除键盘的唯一方法是转到最后一个字段并按“返回”键。考虑到用户在键盘消失之前无法按任何标签这一事实,我想要一个更好的方法来做到这一点。即,如果用户点击屏幕上的任何其他位置,则关闭。

没有MonoTouch.Dialog,它很简单:只需覆盖TouchesBegan并调用EndEditing。但这不适用于MT.D.我已经尝试了子类化DialogViewController并覆盖那里的TouchesBegan,但它不起作用。我现在不知所措。

或者,我想知道,放弃标签栏会更好吗,所以我可以使用顶部带有“后退”按钮的UINavigationController,它不会被键盘隐藏?

4 个答案:

答案 0 :(得分:30)

我建议您使用不会对TableView事件处理程序造成干扰的点击手势识别器:

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

答案 1 :(得分:2)

你也错过了我的问题:Can the keyboard be dismissed by touching outside of the cell in MonoTouch.Dialog? : - )

这是我对MonoTouch.Dialog的第一个功能请求。

回答你的问题:不,这是不可能的。我搜索过并询问过周围没有找到任何答案。

我假设因为它只是一个分段(分组)表,如果它没有分段,就没有任何点击点。但是,这只是我的推测。

我希望米格尔或那些从事单音操作的人会回答这个问题并说是否有可能。可能是未来的改进?

答案 2 :(得分:1)

我想出了一个让我满意的解决方法,所以我回答了我自己的问题。

// 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);
};

每当用户拖动视图时,这将关闭键盘。我找不到与tableview相关的触摸事件,所以这是下一个最好的事情。我欢迎任何其他想法。干杯!

答案 3 :(得分:0)

使用拖动手势而不是建议的点击(不干扰表视图手势)的一种解决方法是覆盖MonoTouch.Dialog.DialogViewController.SizingSource(或MonoTouch.Dialog.DialogViewController.Source,如果你不'想要不均匀的行)并将其提供给DialogViewController。我不知道它是否非常干净或安全。

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);
   }
 }

}