【问题标题】:MonoTouch.Dialog: Dismissing keyboard by touching anywhere in DialogViewControllerMonoTouch.Dialog:通过触摸 DialogViewController 中的任何位置来关闭键盘
【发布时间】:2023-03-08 08:31:02
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: xamarin.ios monotouch.dialog


    【解决方案1】:

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

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

    【讨论】:

    • 太棒了。在阅读了您对stackoverflow.com/questions/10832014/… 的回答后,我意识到我的解决方案可能会在未来引发问题。你的更好,因为它消除了这种可能性,它还提供了我正在寻找的确切功能。谢谢一百万!
    • 您还必须添加 dvc.CancelsTouchesInView = false;否则这将取消您在页面上的所有其他点击!
    • 添加 tap.CancelsTouchesInView = false;防止 TapGestureRecognizer 取消点击所有元素。
    • 如果我们添加了一个轻击手势,我们就无法关闭建议自动完成时显示的标签
    【解决方案2】:

    使用拖动手势而不是建议的点击(不干扰表格视图手势)的一种解决方法是覆盖 MonoTouch.Dialog.DialogViewController.SizingSource(或 MonoTouch.Dialog.DialogViewController.Source,如果你不这样做' t 想要不均匀的行)并将其提供给 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);
       }
     }
    

    }

    【讨论】:

      【解决方案3】:

      我找到了一个让我非常满意的解决方法,所以我正在回答我自己的问题。

      // 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 相关的触摸事件,所以这是下一个最好的事情。我欢迎任何其他想法。干杯!

      【讨论】:

      • 以上会干扰其他 TableView 事件,使用手势识别器,正如我在这个问题的回答中所展示的那样。
      【解决方案4】:

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

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

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

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

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

      【讨论】:

      • 哦,是的,我记得读过你的问题,抱歉。这个问题很遗憾:否则 MT.D 是一个很棒的包。我会等一会儿,以防其他人有答案。如果没有,我会接受你的。
      • 我也是。实施起来似乎并不难。
      猜你喜欢
      • 2011-03-28
      • 2014-07-30
      • 2012-04-23
      • 2011-11-16
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多