16

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

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

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

设定画面

当用户开始打字时,键盘挡住了标签栏...

在此处输入图像描述

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

如果没有 MonoTouch.Dialog,这很容易:只需覆盖 TouchesBegan 并调用 EndEditing。但这不适用于 MT.D。我已经尝试将 DialogViewController 子类化并在那里覆盖 TouchesBegan,但它不起作用。我目前不知所措。

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

4

4 回答 4

30

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

var tap = new UITapGestureRecognizer ();
tap.AddTarget (() => dvc.View.EndEditing (true));
dvc.View.AddGestureRecognizer (tap);
tap.CancelsTouchesInView = false;
于 2012-06-02T17:54:45.213 回答
2

你也错过了我的问题:可以通过触摸 MonoTouch.Dialog 中的单元格外部来关闭键盘吗? :-)

这是我对 MonoTouch.Dialog 的#1 功能请求。

回答你的问题:不。这是不可能的。我四处寻找和询问,但没有找到任何答案。

我假设因为它只是一个分段(分组)表,如果它没有分段,就不会有任何点击的地方。然而,这只是我的猜测。

我希望 miguel 或从事 monotouch 工作的人能回答这个问题并说是否有可能。可能是未来的增强?

于 2012-05-30T22:16:58.703 回答
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 相关的触摸事件,所以这是下一个最好的事情。我欢迎任何其他想法。干杯!

于 2012-05-31T02:10:19.370 回答
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);
   }
 }

}

于 2014-05-02T13:58:01.870 回答