【问题标题】:How do I get keyboard events without a textbox?如何在没有文本框的情况下获取键盘事件?
【发布时间】:2014-06-08 14:00:22
【问题描述】:

在我的 Xamarin.iOS 应用 (C#) 中,我有一个 iPhoneOSGameView(继承自 UIView),我想从外部(比如蓝牙)键盘捕获按键。

由于这是在游戏中添加对键盘控制的支持,我希望能够响应这些事件,而不必像 this question 中建议的那样放置文本框或任何其他文本字段(实际上,它们不是捕获按键,但文本框发生变化,这与我想要做的完全不同)

在 Android 中,我可以通过在我的活动中覆盖 OnKeyDownOnKeyUp 来实现这一点,但在 UIViewUIViewController 上似乎没有类似的事件。

有没有办法在UIViewUIViewController 中捕获按键和按键释放?

由于这是针对 Xamarin.iOS 的,我当然更喜欢 C# 答案,但我想如果需要我可以阅读 Objective-C。

【问题讨论】:

  • @TaW:你为什么要删除 c# 标签?这是针对 C# 程序的,我期待 C# 的答案。如果要删除语言标签,它将是objective-c 标签。我离开了 Objective-c,因为 Objective-c 的答案在某种程度上也被接受了,但是 C# 更受欢迎,因为我自己不能完全理解 Objective-c。
  • 对不起!但是我在您的帖子中没有看到与 C# 的联系。因此,如果是,请尝试在 Tag 中同时指定您的平台(WPF、ASP、Winforms)!啊Monotouch,那个不见了!
  • @TaW:monotouch 标签从一开始就存在。说这是用于“Xamarin.iOS”的部分也从一开始就存在。我在文本中添加了一些说明,以确保每个人都理解这是 c#。
  • 好吧,让我们承认我错了 ;-)

标签: c# ios objective-c xamarin.ios


【解决方案1】:

要在UIView 上获取键盘事件,您需要adopt the UIKeyInput protocol

为此,首先你必须用[Adopts("UIKeyInput")] 装饰你的视图类。

然后,你需要实现UIKeyInput所需的所有方法:

    [Export("hasText")]
    bool HasText { get { return false; } }

    [Export("insertText:")] // Don't forget the colon
    void InsertText(string text) // This is what gets called on a key press
    {
    }

    [Export("deleteBackward")]
    void DeleteBackward()
    {
    }

最后,你必须让 iOS 知道这可以成为第一响应者(不管是什么):

    public override bool CanBecomeFirstResponder { get { return true; } }

然后,当视图出现时,您必须成为第一响应者,例如在WillEnterForeground

    view.BecomeFirstResponder();

当视图离开焦点时不要忘记成为第一响应者,例如在DidEnterBackground

    view.ResignFirstResponder();

最后,最好实现inputView 并让它返回一个空的UIView,这样默认键盘就不会出现:

    private UIView inputView;
    // ...

    inputView = new UIView(new RectangleF());

    // And somewhere else...
    [Export("inputView")]
    public new UIView InputView { get { return inputView; } }

感谢聊天中的@radical 帮助我解决了这个问题。

此解决方案不是关于获取按键按下和按键向上事件,而是关于创建一个新的文本框。如果其他人指出如何实际获得较低级别的按键和按键事件,那将是非常棒的,如果这可能的话。

【讨论】:

  • 这是一个非常好的答案,它对我很有用。您应该将其标记为已接受的答案。
猜你喜欢
  • 2013-01-01
  • 2011-06-04
  • 1970-01-01
  • 2011-10-18
  • 2013-03-13
  • 1970-01-01
  • 2011-11-26
  • 2017-10-21
  • 1970-01-01
相关资源
最近更新 更多