如何在没有文本框的情况下获取键盘事件?

Posted

技术标签:

【中文标题】如何在没有文本框的情况下获取键盘事件?【英文标题】: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#。 好吧,让我们承认我错了 ;-) 【参考方案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 帮助我解决了这个问题。

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

【讨论】:

这是一个非常好的答案,它对我很有用。您应该将其标记为已接受的答案。

以上是关于如何在没有文本框的情况下获取键盘事件?的主要内容,如果未能解决你的问题,请参考以下文章

JS键盘鼠标事件

键盘的按下事件和change事件有啥区别?

移动端点击文本框 键盘弹出解决访问

从 Windows 10 虚拟键盘输入到 WPF 文本框中的快乐表情符号未在文本框的 PreviewTextInput 事件中捕获

用js怎么写一个回车键盘事件

JS笔记 键盘事件