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

C# 如何在没有文本框的情况下获取键盘事件?,c#,ios,objective-c,xamarin.ios,C#,Ios,Objective C,Xamarin.ios,在我的Xamarin.iOS应用程序(C#)中,我有一个iPhoneOSGameView(它继承自UIView),我想从外部(比如蓝牙)键盘捕获按键 因为这是为了在游戏中添加对键盘控制的支持,所以我希望能够响应这些事件,而不必像中建议的那样放置文本框或任何其他文本字段(实际上,它们不是捕获按键,而是文本框的更改,这与我想做的完全不同) 在Android中,我可以通过在我的活动中覆盖OnKeyDown和onkeydup来实现这一点,但是UIView或UIViewController上似乎没有类似的

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

因为这是为了在游戏中添加对键盘控制的支持,所以我希望能够响应这些事件,而不必像中建议的那样放置文本框或任何其他文本字段(实际上,它们不是捕获按键,而是文本框的更改,这与我想做的完全不同)

在Android中,我可以通过在我的活动中覆盖
OnKeyDown
onkeydup
来实现这一点,但是
UIView
UIViewController
上似乎没有类似的事件

UIView
UIViewController
中是否有捕获按键和按键释放的方法


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

为了在
UIView
上获取键盘事件,您需要

要做到这一点,首先必须使用
[采用(“UIKeyInput”)]
装饰视图类

然后,您需要实现
uikeyinport
所需的所有方法:

    [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知道这可以成为第一响应者(不管是什么):

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

    view.BecomeFirstResponder();
    view.ResignFirstResponder();
当视图离开焦点时,不要忘记停止作为第一响应者,例如在
DidEnterBackground

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

    private UIView inputView;
    // ...

    inputView = new UIView(new RectangleF());

    // And somewhere else...
    [Export("inputView")]
    public new UIView InputView { get { return inputView; } }
感谢聊天中的@radial帮我解决了这个问题


此解决方案不是关于获取“向下键”和“向上键”事件,而是关于创建一个新的文本框。如果有人指出如何真正让低级别的事件向下键和向上键(如果可能的话),那就太棒了。

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